Справочник по ООП для руководства PHP – может кто-то объяснить это

Я видел это в руководстве по ООП PHP http://www.php.net/manual/en/language.oop5.visibility.php, и я не могу понять, почему выход не является: Foo :: testPrivate Foo: : testPublic

class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic 

Все дело в видимости переменных / методов.

Вы заметите, что в классе Bar метод testPrivate() является private . Это означает, что ТОЛЬКО сам может получить доступ к этому методу. Нет детей.

Поэтому, когда Foo расширяет Bar , а затем просит запустить метод test() , он выполняет две функции:

  1. Он переопределяет метод testPublic() потому что он является общедоступным, и Foo имеет право переопределить его своей собственной версией.
  2. Он вызывает test() на Bar (поскольку test() существует только в Bar() ).

testPrivate() не переопределяется и является частью класса, содержащего test() . Поэтому печатается Bar::testPrivate .
testPublic() переопределяется и является частью класса наследования. Поэтому печатается Foo::testPublic .

В некоторых случаях легко заметить, что вам нужен частный метод в классе Bar , но вы также хотите, чтобы класс Foo получил к нему доступ.
Но подождите, это публично или личное?
Здесь идет защищенный модификатор.
Когда метод является приватным , только метод класса может вызвать метод.
Когда метод является общедоступным , каждый может назвать его, как свободная сторона.
Когда метод защищен , сам класс может его вызвать, а также тот, кто ввел этот метод (дети), сможет назвать его как собственный метод.

Я опубликовал тот же вопрос несколько дней назад … потому что это поведение не было логичным для меня. $ это всегда относится к текущему объекту, в котором он используется. На мой взгляд, пример вроде этого должен вызывать ошибку или предупреждение или что-то в этом роде. Потому что в приведенном выше примере вы фактически получаете доступ к частным членам: SSS, КОТОРЫЙ СЛУЧАЙ, ЧТОБЫ БЫТЬ НЕВОЗМОЖНО!