合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 后期静态绑定 **self::** ```php <?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } // A定义who和test,test里面静态条用who // B继承A,并重写了who // 执行B::test() // 分析: // 执行的test()是B继承A的,而test里面是静态调用who的。而现在的who是被B重写的,所以理应输出B;但是test定义时,是静态定义调用who的,who是A的,那么问题来了,B重写的who会替代A:test()的定义吗?答案是不会,因为输出还是A。其实我们可以发现,这是php类的一个特性,那就是前期静态绑定了,这和javascript闭包里面的静态作用域很像 class B extends A { public static function who() { echo __CLASS__; } } B::test(); // A // $b = new B; // $b->test(); ``` 有没有办法突破php的这个特性呢,使其延后绑定,答案是:有,用关键字 static。 **static::** ```php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); // B ``` > 该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。 更多细节、用法请查看官方文档。 ### 参考 [PHP: 后期静态绑定 - Manual](http://php.net/manual/zh/language.oop5.late-static-bindings.php) last update:2017-8-29 11:06:21