<?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();
?>
以下是输出:
A
C
C
任何人都可以评估一下这个输出是如何产生的吗?
答案 0 :(得分:7)
test()“A”中第一行的结果不利用Late Static Binding,因为在所有情况下,你直接调用类“A”的foo实现(技术上它是LSB,但是static被绑定到A)。第二行和第三行用static关键字证明了预期的行为,继承链无所谓,static指的是被调用的类。因此,即使您从B调用parent :: foo(),该实现也使用LSB,其中static关键字解析为被调用的类,即C语言。对于self :: foo()也是如此。