Доброго вечера.
Пример почти что из документации. Создаем класс с приватным и публичным методом, наследуем от него другой, вызываем в потомке унаследованный метод, и получаем странное поведение - код ниже дважды выведет на экран "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() будет скопирован в В, следовательно его область действия по прежнему А, и вызов будет успешен".