Ну, я не могу много рассказать о деталях синтаксического анализатора, но ключ к пониманию заключается в понимании того, что означает visibility :
Члены класса, объявленные общедоступными, доступны везде.Члены, объявленные защищенными, могут быть доступны только внутри самого класса и унаследованных и родительских классов.Члены, объявленные как частные, могут быть доступны только классу, который определил член.
Теперь в руководстве по PHP также указано :
Например, когда вы расширяете класс, подкласс наследует все открытые и защищенныеметоды из родительского класса.Если класс не переопределяет эти методы, они сохранят свою первоначальную функциональность.
Если вы выполните var_dump($d)
для производного класса, вы увидите, что он содержит Base->z
:
object(Derived)#2 (1) {
["z":"Base":private]=>
int(4)
}
Таким образом, в Base есть ссылка на z, ноон является частным, и поскольку частный означает, что член может быть доступен только классу, который определяет член, вы не можете получить к нему доступ из Derived.
Предлагая публичные методы в Base для доступа к приватному члену, вы эффективно контролируете доступ через родительский метод.Возможно, $z
- это то, что должно быть доступно только для чтения в расширенных классах, например, адаптер базы данных.
Это скрытие информации и контроль доступа.Это не значит, что если вы расширите Base, вы потеряете $ z.Наследование - это отношение is-a .Производное is-a Base и, как таковое, имеет $ z, хотя не само по себе, а через своего родителя.