Intereting Posts
Обнаружить, если загруженный файл слишком большой Yii2: использовать обработчик ошибок только для фатальных ошибок или указать обработанные типы ошибок Использование $ this в «анонимном» объекте Отправка параметров POST с помощью Postman не работает, но отправка параметров GET Выбор и проверка наличия пользователя в таблице без foreach в ларавельном лезвии Отображение чего-то другого, кроме ID в эшафоте CakePHP Необходимое руководство по перенаправлению пользователя, если он не вошел в систему на панели администратора переменная php while loop для каждого третьего div Отправка JSON на PHP с помощью ajax Предупреждение: mkdir (): Файл существует Получить содержимое файла XML с помощью PHP PHP / RegEx – конвертировать URL-адреса в ссылки, обнаруживая .com / .net / .org / .edu и т. Д. Ошибка отображения на php ТипError: k.google.maps.Load не является функцией ошибки в gmap Как я могу перенаправить ошибку 404 на пользовательскую страницу 404 с помощью Codeigniter?

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

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

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 обеспечивает определенную степень инкапсуляции для членов класса, и это может быть довольно запутанным, если вы не нашли времени, чтобы понять это.