Рассмотрим следующий фрагмент:
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();