Один образец кода, который я получил с веб-сайта, но мне было сложно понять результат. Я использую код:
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(); }
A::foo();
Когда вы прочтете это из приведенного выше утверждения .. Разрешение поздних статических привязок остановится при полностью разрешенном статическом вызове без возврата , так как это полностью разрешенный статический вызов, вы получите вывод A
parent::foo();
и self::foo();
Опять же, из приведенного выше утверждения .. статические вызовы с использованием таких ключевых слов, как parent :: или self ::, пересылают вызывающую информацию.
Таким образом, это, очевидно, будет печатать C и C .. потому что вы сделали C::test();
, class C
является фактическим абонентом.