Унаследованный родительский метод PHP не может получить доступ к частному свойству дочернего элемента

Прежде всего: довольно похожая проблема была опубликована и каким-то образом уже решена, но все еще не решает мою конкретную проблему. Подробнее об этом позже.

В словах: У меня есть базовый класс, который предоставляет некоторые методы всем дочерним элементам, но не содержит никаких свойств. Мой ребенок наследует эти методы, Если дочернее свойство защищено или общедоступно , все работает нормально, но если дочернее свойство частное , происходит сбой без ошибок (ничего не происходит).

В коде:

class MyBaseClass {
    public function __set($name, $value) {
        if(!property_exists($this, $name))
            throw new Exception("Property '$name' does not exist!");
        $this->$name = $value;
    }
}

class ChildClass extends MyBaseClass {
    public $publicProperty;
    protected $protectedProperty;
    private $privateProperty;
}

$myChild = new ChildClass();
$myChild->publicProperty = 'hello world';    //works of course!
$myChild->protectedProperty = 'hello world'; //works as expected
$myChild->privateProperty = 'hello world';   //doesn't work?

Вышеупомянутая аналогичная проблема была решена с использованием магического метода __ set () для доступа к закрытым свойствам, но я уже этим занимаюсь. Если я реализую __ set () внутри дочернего элемента, он, конечно, будет работать, но идея состоит в том, что дочерний элемент наследует __ set () от своего родителя, но, очевидно, он не может доступ к закрытому методу ребенка.

Это сделано специально? Я что-то не так делаю? или мой подход просто отстой по замыслу?

Справочная информация: Моя первоначальная идея заключалась в следующем: мне не нравится вся динамичность в __ set () . Обычно частное свойство никогда не должно быть доступно извне, поэтому я реализовал метание __set- и __get-методов в моем конечном базовом классе (от которого наследуются все классы).

Теперь я хочу динамически создать объект экземпляр из файла XML и, следовательно, требуется доступ к свойствам. Я установил правило, что любой класс, создающий экземпляр XML, должен реализовывать волшебный метод __ set () и поэтому может быть создан динамически. Вместо того, чтобы реализовывать его в каждом классе, который может когда-нибудь появиться, я решил сделать их наследованием от класса, называемого вроде class Spawnable {} , который предоставляет необходимый метод __set.

10
задан Community 23 May 2017 в 12:09
поделиться