Почему PHP иногда ведет себя так, как будто приватные методы словно наследуются?

Доброго вечера.
Пример почти что из документации. Создаем класс с приватным и публичным методом, наследуем от него другой, вызываем в потомке унаследованный метод, и получаем странное поведение - код ниже дважды выведет на экран "class A", т.е. исполнится приватный метод класса A. Это понятно, т.к. приватные методы не наследуемы. Но там есть static::foo(), а поскольку я вызываю метод test() из другого контекста, он должен работать иначе. Я ожидаю ошибку при попытке доступа к приватному методу в классе B, ведь static должен указывать на B, ведь в этом вся суть позднего статического связывания.
class A {
    public $property = 'A';
    private function foo() {
        echo 'class ' . __CLASS__;
        echo 'prop ' . $this->property;
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}
class B extends A {
    public $property = 'B';
}

// выведет два раза 'class A prop B', во второй раз 
// должна быть ошибка доступа к приватному методу
(new B)->test();

При этом, если публичное свойство в классе A сделать приватным, будет выводиться 'class A prop A'. То есть, публичное свойство в потомке имеет меньший приоритет, чем приватное свойство в родителе. Как такое может быть?

Это выглядит так, как будто метод foo() каким-то образом все же присутствует в B, либо что static работает не совсем так, как описано в доках.

Чем объясняется такое поведение?
Заранее спасибо.

P.S. В документации, цитата, написано, что "foo() будет скопирован в В, следовательно его область действия по прежнему А, и вызов будет успешен".
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
DevMan
@DevMan Куратор тега PHP
модификаторы доступа огрничивают контекст, в котором возможен вызов.
у тебя все вызовы происходят в контексте класса А, не В.
вот если изменить класс В
class B extends A {
	public $property = 'B';
	public function test() {
		$this->foo();
	}
}
то получишь ошибку.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы