Возможно, комментарий "foo () будет скопирован в B" немного запутан или неправильно интерпретирован.Функция foo () по-прежнему закрыта для A и доступна только из методов в A.
т.е.В примере, если вы попытаетесь выполнить $b->foo()
, он все равно не получится, как ожидалось.
Это, как я объяснил пример для себя и, возможно, будет полезно для других:
С учетом класса B.
$b->test()
может получить доступ к foo () как открытый член A.
$this->foo()
также успешно выполняется в $b->test()
$static::foo()
успешно, потому что он вызывает версию foo (), определенную в A, из test (), которая также определена в A. Нет конфликта областей действия.
С учетом класса B.
Когда функция foo () переопределена в классе C, $c->test()
, конечно, все еще доступна как открытый член, если A.
и в пределах $c->test()
$ this-> foo ()доступный как закрытый член A. - все хорошо.
НО $static::foo()
сейчас пытается получить доступ из A, версии foo (), определенной в классе C, и поэтому терпит неудачу, потому что она является закрытой в C.- согласно сообщению об ошибке.