Добрый день. Прошу помощи разобраться в сути наследования языка 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() - его тоже нужно переопределить в классе С
Комментариев нет:
Отправить комментарий