第一组问题:
1.成员变量与静态成员变量可否同名;
2.类的成员变量和静态成员变量交换访问方式能否访问到。
第二组问题:
1.成员方法与静态成员方法能否同名;
2.成员方法或静态成员方法是否可以与成员变量或静态成员变量同名;
3.如果交换访问方式是否可以成功访问。
实验准备:
class Test{ public static $sv = 1; public $pv = 2; public static function sv(){ echo 'static function sv.<br>'; } public function pv(){ echo 'normal function pv.<br>'; } }
第一组问题实验:
echo Test::$sv;//1 echo Test::$pv;//Fatal error: Uncaught Error: Access to undeclared static property: Test::$pv $test = new Test(); echo $test->pv;//空白 var_dump($test->sv);//NULL
1.成员变量与静态成员变量不能同名;
2.交换访问方式不能访问到。
第二组问题实验:
Test::sv();//static function sv. Test::pv();//normal function pv. $test = new Test(); $test->sv();//static function sv. $test->pv();//normal function pv.
1.成员方法与静态成员方法不能同名;
2.成员方法/静态成员方法可以与成员变量/静态成员变量同名;
3.交换访问方式可以访问得到,但不推荐交换调用。
从类的存储结构出发理解以上问题:
//Zend\zend.h:116 struct _zend_class_entry { //......省略部分内容 int default_properties_count; int default_static_members_count; zval *default_properties_table; zval *default_static_members_table; zval *static_members_table; HashTable function_table; HashTable properties_info; HashTable constants_table; //......又省略大部分内容 };
(1)类的成员变量和静态成员变量存储于类结构体的不同属性中,同时不允许同名,所以交换访问方式不能访问到;
(2)成员方法与静态成员方法存于类结构体的同一属性中,所以交换访问方式可以访问得到,但非静态调用静态成员方法会有E_STRICT级别的错误信息。