abstract class Component {
protected $x = 123;
}
class A extends Component {
private $b;
public function __construct() {
$this->b = new B();
//$this->b->x = 234;
}
public function getBX() {
return $this->b->x;
}
}
class B extends Component {
//protected $x = 777;
public function __construct() {
$this->x = 567;
}
}
echo (new A())->getBX();
try{
(new B())->x = null;
}catch(Exception $e){
echo 'Как и ожидалось';
}
Я что-то в этой жизни пропустил. Почему property x доступна как public? PHP работает с protected не только с дочерними элементами, но и связывает их через parent?
В целом это документированное поведение:
Видимость из других объектов
Объекты, которые имеют общий тип (наследуются от одного класса), имеют
доступ к элементам с модификаторами private и protected друг друга,
даже если не являются одним и тем же экземпляром. Это объясняется тем,
что реализация видимости элементов известна внутри этих объектов
Хотя если прочитать оригинал документации, то данный абзац там выглядит иначе:
Objects of the same type will have access to each others private and protected members even though they are not the same instances. This is because the implementation specific details are already known when inside those objects.
Как видно здесь нет никаких "наследуются от одного класса". А просто речь идет, когда два экземпляра объекта одного и того же класса, имеют доступ к private полям друг друга. Это в принципе нормально, и имеет место быть в любых других языках.
Поэтому интересно бы узнать, откуда появилась эта приписка в рускоязычной документации, т.к. именно она отражает ситуацию, описанную в данном вопросе.
Тем не менее, по определению
Модификатор protected (защищенный) разрешает доступ самому классу, наследующим его классам и родительским классам.
общий родительский класс играет свою роль, и если вы перенесете $x в класс B, то доступа уже не получите.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости