我从网站上获得的一个代码示例,但我很难理解输出。我正在分享代码:
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();
输出如下::
A
C
C
如果解释上述输出,我会得到很大的帮助。在此先感谢。
答案 0 :(得分:8)
我从网站上获得的一个代码示例,但对我来说很难 了解输出。我正在分享代码
此代码是 Late Static Binding 概念的PHP手册中的精确副本..
后期静态绑定的解析将在完全解析的静态处停止 打电话没有后退。另一方面,使用关键字进行静态调用 像parent ::或self ::将转发呼叫信息。
当你执行C::test();
时,test()
下的class B
会被调用,因为test()
上没有class C
。
所以你显然在这里..
public static function test()
{
A::foo();
parent::foo();
self::foo();
}
A::foo();
正如您从上面的语句中读到的那样.. 延迟静态绑定的解析将停止在完全解析的静态调用而没有回退,所以因为它是一个完全解析的静态调用,所以你会得到输出A
parent::foo();
和self::foo();
同样,从上面的语句中.. 使用parent ::或self ::等关键字的静态调用将转发调用信息。
所以这显然会打印C和C ..因为你做C::test();
后,class C
就是实际的来电者。