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

Я бы очень помог, если объясняется вышеописанная информация. Заранее спасибо.

Один образец кода, который я получил с веб-сайта, но мне было сложно понять результат. Я использую код

Этот код является точной репликой из руководства PHP по концепции поздней статической привязки .

Объяснение этого кода из руководства.

Разрешение поздних статических привязок остановится при полностью разрешенном статическом вызове без возврата. С другой стороны, статические вызовы с использованием таких ключевых слов, как parent :: или self ::, пересылают вызывающую информацию.

Источник

Поэтому позвольте мне подробно объяснить …

Когда вы это сделаете .. C::test(); , test() под class B будет вызываться, так как нет test() доступного для class C

Итак, вы, очевидно, здесь.

  public static function test() { A::foo(); parent::foo(); self::foo(); } 

Случай 1: A::foo();

Когда вы прочтете это из приведенного выше утверждения .. Разрешение поздних статических привязок остановится при полностью разрешенном статическом вызове без возврата , так как это полностью разрешенный статический вызов, вы получите вывод A

Случай 2 и 3: parent::foo(); и self::foo();

Опять же, из приведенного выше утверждения .. статические вызовы с использованием таких ключевых слов, как parent :: или self ::, пересылают вызывающую информацию.

Таким образом, это, очевидно, будет печатать C и C .. потому что вы сделали C::test(); , class C является фактическим абонентом.