Переадресации и номера-переадресация звонков в позднее статическое связывание (на 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 3

1 ответ:

Результат из первой строки в test() "A "не использует позднюю статическую привязку, так как во всех случаях вы непосредственно вызываете реализацию класса"A" foo (технически это LSB, но статика привязана к A). Вторая и третья строки демонстрируют ожидаемое поведение с ключевым словом static, цепочка наследования не имеет значения, static относится к вызываемому классу. Поэтому, даже если вы вызываете parent:: foo () из B, эта реализация использовала LSB, где статическое ключевое слово разрешает к вызываемому классу, который является C. То же самое происходит с self::foo().