Объяснение видимости и наследования членов класса PHP

Рассмотрим следующий фрагмент:

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

Solutions Collecting From Web of "Объяснение видимости и наследования членов класса PHP"

От 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();