![6b12f13ed414ed3eb6117b5a58c3771a.png](https://i-blog.csdnimg.cn/blog_migrate/370a457f76cb2a5f5bdf4bdc06fc4ee6.jpeg)
php中文网最新课程
每日17点准时技术干货分享
![223ef0cce89a8a7651fb34b301deb6b5.png](https://i-blog.csdnimg.cn/blog_migrate/1188af14b7c59b45ebfc63d86b48f710.jpeg)
class A { public static $_a = 'Class A'; public static function echoProperty(){ echo self::$_a . PHP_EOL; }}class B extends A { public static $_a = 'Class B';}$obj = new B();B::echoProperty();//输出 Class A
之所以会这样是因为使用self:: 或者__CLASS__对当前类的静态引用,取决于定义被调用方法所在的类,将上面Class A的方法echoProperty做一下修改变成:
class A { public static $_a = 'Class A'; public static function echoProperty(){ echo static::$_a . PHP_EOL; }}//再次调用B::echoProperty将输出 'CLASS B'
为了避免上面第一个例子中看到的子类重写父类的静态属性后,使用继承来的方法仍然访问父类的静态属性, PHP5.3增加了一个新的语法:
后期静态绑定(Late static binding), 使用static关键字替代self关键字,使得static指向与get_called_class()返回的相同的类,即当前调用静态方法的类, 该关键字对于静态方法的访问同样有效。
下面的例子更好的说明了new self()和new static()之间的差异(后者使用了PHP的后期静态绑定指向调用方法的当前类)
class A { public static function get_self() { return new self(); } public static function get_static() { return new static(); }}class B extends A {}echo get_class(B::get_self()); // Aecho get_class(B::get_static()); // Becho get_class(A::get_self()); // Aecho get_class(A::get_static()); // A
-END-
▼