Я видел это в руководстве по ООП 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()
, он выполняет две функции:
testPublic()
потому что он является общедоступным, и Foo
имеет право переопределить его своей собственной версией. test()
на Bar
(поскольку test()
существует только в Bar()
). testPrivate()
не переопределяется и является частью класса, содержащего test()
. Поэтому печатается Bar::testPrivate
.
testPublic()
переопределяется и является частью класса наследования. Поэтому печатается Foo::testPublic
.
В некоторых случаях легко заметить, что вам нужен частный метод в классе Bar , но вы также хотите, чтобы класс Foo получил к нему доступ.
Но подождите, это публично или личное?
Здесь идет защищенный модификатор.
Когда метод является приватным , только метод класса может вызвать метод.
Когда метод является общедоступным , каждый может назвать его, как свободная сторона.
Когда метод защищен , сам класс может его вызвать, а также тот, кто ввел этот метод (дети), сможет назвать его как собственный метод.
Я опубликовал тот же вопрос несколько дней назад … потому что это поведение не было логичным для меня. $ это всегда относится к текущему объекту, в котором он используется. На мой взгляд, пример вроде этого должен вызывать ошибку или предупреждение или что-то в этом роде. Потому что в приведенном выше примере вы фактически получаете доступ к частным членам: SSS, КОТОРЫЙ СЛУЧАЙ, ЧТОБЫ БЫТЬ НЕВОЗМОЖНО!