Частный метод переопределения и видимости

Я с трудом пытаюсь понять вывод следующего кода:

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(); 

Вывод:

  • Категории с дополнительным PHP / MYSQL
  • как найти число понедельников или понедельника между двумя датами?
  • Пример PHP для PayPal Adaptive Payments ConvertCurrency API
  • Стандартный ввод PHP?
  • Как я могу остановить cURL при использовании 100 Continue?
  • Подчеркивание в php-функции
  •  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 () ? Также частный метод из родительского класса не будет наследоваться, по определению! Это не имеет никакого смысла. Почему родительский метод называется вызываемым ???

  • Есть ли способ установить частное / защищенное статическое свойство с использованием классов отражения?
  • Странное поведение при переопределении частных методов
  • По умолчанию видимость методов класса в PHP
  • 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 обеспечивает определенную степень инкапсуляции для членов класса, и это может быть довольно запутанным, если вы не нашли времени, чтобы понять это.

    PHP is the Best Programming Language in the world.