1.网上看到一道题,没答案,自己执行了下,发现和自己想的不一样,新手求解惑
2.代码如下:
class A
{
public static function foo()
{
static::who();
}
public static function who(){
echo __CLASS__;
}
}
class B extends A{
public static function test()
{
A::foo();
parent::foo();
self::foo();
}
public static function who(){
echo __CLASS__;
}
}
class C extends B{
public static function who(){
echo __CLASS__;
}
}
C::test();
3.输出结果为 ACC,求大神分析解答下
因为后期静态绑定
static
是运行时计算的, 它会沿着调用栈向上回溯. 直到找到明确指定的类名.回到例子, 对它进行简化, 排除掉一些干扰代码:
运行到
static::who()
时, 向上回溯, 发现调用者为parent::foo()
, 因为parent
是转发调用, 所以继续向上回溯,C::test()
,C
是明确的类名, 所以计算结果为C
.调用栈信息:
看栈顶这行信息
#0 C::who() called at [E:\123.php:7]
,static
计算出的结果为类名C
.