Protected связь через Parent

233
21 июня 2018, 03:20
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?

Answer 1

В целом это документированное поведение:

Видимость из других объектов

Объекты, которые имеют общий тип (наследуются от одного класса), имеют доступ к элементам с модификаторами 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, то доступа уже не получите.

READ ALSO
PHP Отправка длинного письма на почту

PHP Отправка длинного письма на почту

Есть текст, в котором > 70 символовПри отправке на почту, письмо не доставляется, хотя функция mail() возвращает true

238
Редирект на страницу через php

Редирект на страницу через php

Как сделать так, чтобы при редиректе через header() текущее положение на странице оставалось на своем месте и не перекидывало на верх страницы?

259
Как вывести данные с phpmyadmin и отобразить в таблице?

Как вывести данные с phpmyadmin и отобразить в таблице?

Есть 4 таблицы и база данных ( с php никогда не работал) Как можно выводить данные в таблицу самым простым способом ?

339
Как установить пароль на crud?

Как установить пароль на crud?

создал crud под названием admin , конечно туда может зайти любой sitenamecom/admin и использовать методы REST new show edit delete

245