Рассмотрим следующий фрагмент:
Class A { private $a = 'foo'; public function F() { return $this->a; } } Class B extends A { private $a = 'bar'; } echo (new B)->F();
Результатом является foo
. Ну, это свершившийся факт, который php работает таким образом. Но мне интересно, почему. Если в выражении F()
метода родителя я использую псевдо переменную $this
, он ссылается на контекст объекта. Поэтому, когда я вызываю дочерний унаследованный метод F()
$this
переменная означает текущий экземпляр B
с private $a = 'bar'
, не так ли?
Обновите Спасибо AbraCadaver за ваш ответ. Для меня все еще неясно одно: если $this
переменная является объектом B во время вызова F()
, как он может получить доступ к закрытому члену родителя? Правильно ли я понял, что $this
в реализации метода родителя похоже на:
public function F(B $obj) { return $obj->a; }
Таким образом, интерпретатор проверяет видимость видимости от родительского класса, а в случае частной сферы он выделяет B $obj
для A $obj
От PHP: Видимость :
Доступ к элементам, объявленным защищенными, может быть доступен только внутри самого класса и наследуемых и родительских классов. Участникам, объявленным как private, может быть доступен только класс, определяющий участника.
В вашем примере, независимо от объекта класса B
, класс A
не может получить доступ к private
свойству другого класса.
Кроме того, если B
имеет защищенное свойство, которое не может переопределить свойство класса A
поскольку оно является private
.
И ваш пример, и следующий выход foo
:
Class A { private $a = 'foo'; public function F() { return $this->a; } } Class B extends A { protected $a = 'bar'; public function F() { return parent::F(); } } echo (new B)->F();
Однако, если класс A
также protected
он может быть переопределен классом B
а класс A
имеет доступ к свойству в классе B
Полоса выхода:
Class A { protected $a = 'foo'; public function F() { return $this->a; } } Class B extends A { protected $a = 'bar'; public function F() { return parent::F(); } } echo (new B)->F();