php对象之静态绑定

在了解静态绑定时,我们需要提前了解两个概念:转发调用和非转发调用

转发调用

进行静态调用时,使用self::、parent::、static::、forward_static_call()进行调用

非转发调用

进行静态调用时使用类名::和非静态调用(例 $obj->test())方式调用

现在我们来看看官方文档所说的静态绑定的概念

后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名

借助例子分析,如下:


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

如下所示,输出了 A C C
php对象之静态绑定_第1张图片
Paste_Image.png

你可能感兴趣的:(php对象之静态绑定)