Я с трудом пытаюсь понять вывод следующего кода:
class Bar { public function test() { $this->testPublic(); $this->testPrivate(); } 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();
Вывод:
Foo::testPublic Bar::testPrivate
Класс Foo переопределяет testPublic () и testPrivate () и наследует test () . Когда я вызываю test () , существует явная инструкция envolving $ this pseudo variable, поэтому после того, как я создал экземпляр $ myFoo , окончательные вызовы функции test () были бы $ myFoo-> testPublic () и $ myFoo-> testPrivate ( ) . Первый вывод, как я и ожидал, так как я перепробовал метод testPublic () для эхо Foo :: testPublic . Но второй вывод не имеет для меня никакого смысла. Почему Bar :: testPrivate, если я перепробовал метод testPrivate () ? Также частный метод из родительского класса не будет наследоваться, по определению! Это не имеет никакого смысла. Почему родительский метод называется вызываемым ???
Проблема с вашим кодом заключается в том, что метод Bar::testPrivate
является private
, поэтому он не может быть переопределен дочерними классами. Во-первых, я рекомендую вам ознакомиться с видимостью на PHP – http://www.php.net/manual/en/language.oop5.visibility.php . Там вы узнаете, что только public
и protected
методы / свойства класса могут быть переопределены, private
не могут.
В качестве хорошего примера попробуйте изменить видимость метода Bar::testPrivate
как общедоступным, так и защищенным, без изменения чего-либо еще в вашем примере кода. Теперь попробуйте выполнить ваши тесты. Что происходит? Эта:
PHP Неустранимая ошибка: уровень доступа к Foo :: testPrivate () должен быть защищен (как в классе Bar) или слабее
Большой вопрос: «почему?». Итак, вы теперь переопределили Bar::testPrivate
с частным Foo:testPrivate
. Этот новый закрытый метод выходит за рамки для Bar::test
, потому что частные члены класса видны только для их текущего класса, а не для родительских / дочерних классов!
Поэтому, как вы можете видеть, OOP обеспечивает определенную степень инкапсуляции для членов класса, и это может быть довольно запутанным, если вы не нашли времени, чтобы понять это.