Частный метод переопределения и видимости
Я с трудом пытаюсь понять вывод следующего кода:
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 () ? Также частный метод из родительского класса не будет наследоваться, по определению! Это не имеет никакого смысла. Почему родительский метод называется вызываемым ???
One Solution collect form web for “Частный метод переопределения и видимости”
Проблема с вашим кодом заключается в том, что метод 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 обеспечивает определенную степень инкапсуляции для членов класса, и это может быть довольно запутанным, если вы не нашли времени, чтобы понять это.