Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

Суть наследования в php

Добрый день. Прошу помощи разобраться в сути наследования языка php.
В мануале есть такой пример: http://php.net/manual/ru/language.oop5.late-static-bindings.php
class A { private function foo() { echo "success!
"; } public function test() { $this->foo(); static::foo(); } }
class B extends A { /* foo() будет скопирован в В, следовательно его область действия по прежнему А, и вызов будет успешен*/ }
class C extends A { private function foo() { /* исходный метод заменен; область действия нового метода С */ } }
$b = new B(); $b->test(); $c = new C(); $c->test(); //не верно ?>
Меня смущает комментарий
/* foo() будет скопирован в В, следовательно его область действия по прежнему А, и вызов будет успешен*/
Что значит скопирован? Скопирован всмысле отнаследован? Но ведь невозможно наследовать приватные методы и свойства. И правильно ли я понимаю что вызвать $b->foo() нельзя как раз потому, что метод приватный? Но почему тогда из метода test доступно this->foo(), ведь this указывает нам на экземпляр текущего обьекта, а не класса? А объект у нас b. Спасибо.


Ответ

При наследовании - унаследуются метод test() и метод foo(), у каждого будет область видимости А, хоть и класс В, следовательно когда вы обращаетесь к методу test() в классе В - он может обратиться к foo() т.к. у них одна область видимости. Но в случае с классом С - у вас переобъявляется метод foo() а следовательно у него область видимости уже становится С и метод с областью видимости А не может к нему обращаться, так как это приватный метод. А значит чтоб вы могли использовать метод test() - его тоже нужно переопределить в классе С

Комментариев нет:

Отправить комментарий