Я читаю руководство по php о функции LSB, я понимаю, как он работает в статическом контексте, но я не совсем понимаю его в нестационарном контексте. Пример в руководстве:
<?php class A { private function foo() { echo "success!\n"; } public function test() { $this->foo(); static::foo(); } } class B extends A { /* foo() will be copied to B, hence its scope will still be A and * the call be successful */ } class C extends A { private function foo() { /* original method is replaced; the scope of the new one is C */ } } $b = new B(); $b->test(); $c = new C(); $c->test(); //fails ?>
Вывод:
success! success! success! Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
Я не понимаю для класса B, как частный метод в A может быть унаследован B? Может ли кто-нибудь пройти меня через то, что здесь происходит? Большое спасибо!
Использование позднего статического связывания только изменяет метод, который выбирается для вызова. Как только метод выбран, правила видимости применяются для определения того, можно ли его вызывать.
Для B
, A::test
находит и вызывает A::foo
. Комментарий в B
неверен – foo
не копируется в B
Поскольку он является конфиденциальным, он может быть вызван только из других методов в A
таких как A::test
.
C
не работает, потому что последний механизм статического привязки обнаруживает новый закрытый метод C::foo
, но методы A
не имеют к нему доступа.
Я рекомендовал вам зарезервировать позднюю статическую привязку для статических полей и методов, чтобы избежать путаницы.