Переадресации и номера-переадресация звонков в позднее статическое связывание (на PHP 5.3)
<?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
Может ли кто-нибудь оценить, как был произведен этот результат?1 ответ:
Результат из первой строки в test() "A "не использует позднюю статическую привязку, так как во всех случаях вы непосредственно вызываете реализацию класса"A" foo (технически это LSB, но статика привязана к A). Вторая и третья строки демонстрируют ожидаемое поведение с ключевым словом static, цепочка наследования не имеет значения, static относится к вызываемому классу. Поэтому, даже если вы вызываете parent:: foo () из B, эта реализация использовала LSB, где статическое ключевое слово разрешает к вызываемому классу, который является C. То же самое происходит с self::foo().