在了解静态绑定时,我们需要提前了解两个概念:转发调用和非转发调用
转发调用
进行静态调用时,使用self::、parent::、static::、forward_static_call()进行调用
非转发调用
进行静态调用时使用类名::和非静态调用(例 $obj->test())方式调用
现在我们来看看官方文档所说的静态绑定的概念
后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名
借助例子分析,如下:
<?php
class A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function who() {
echo __CLASS__."\n";
}
}
C::test();
?>
1、C::test() 使用的是 非转发调用,因为它属于类名::进行调用的,故根据官方概念,这时存储了 C 类名
2、然后执行到B类下的test()方法, 调用了A::foo() ,这又是属于非转发,所以这时存储了A类名
再执行到了A 类中的foo方法,使用了 static::who,这属于转发调用,所以这时存储的还是A类名,然后就输出了A
3、当第2步执行完了,开始执行parent::foo(),这属于转发调用,所以这时还是存储C类名,后面执行的也都是转发调用,所以最后输出了C
4、当第3不执行完了,开始执行self::foo(),这和第三步类似,结果也输出了 C