PHP学习笔记(二):类结构之(静态)成员变量与(静态)方法

第一组问题:

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级别的错误信息。

猜你喜欢

转载自www.cnblogs.com/ling-diary/p/9229754.html