Прежде всего: A довольно похожая проблема была опубликована и как-то решена уже, но по-прежнему не отвечает на мою конкретную проблему. Подробнее об этом позже.
В словах: У меня есть базовый класс, который предоставляет некоторые методы для всех дочерних элементов, но не содержит никакого свойства. Мой ребенок наследует эти методы, которые должны использоваться для доступа к дочерним свойствам.
Если дочернее свойство protected
или public
, все работает нормально, но если дочернее свойство private
, оно выходит из строя без ошибок (просто ничего не происходит).
В коде:
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?
Вышеупомянутая подобная проблема получила решение использовать метод magic __set()
для доступа к приватным свойствам, но это я уже делаю. Если я реализую __set()
внутри дочернего элемента, это работает, конечно, но идея состоит в том, что ребенок наследует __set()
от него родителя, но, очевидно, он не может получить доступ к дочернему частному методу.
Это специально? Я что-то делаю неправильно? или мой подход просто дерьмо по дизайну?
Фон:
Моя оригинальная идея: вся динамическая вещь о __set()
- это то, что мне не нравится. Обычно частная собственность никогда не должна быть доступна извне, поэтому я реализовал металирование __set- и __get-методов в моем конечном базовом классе (из которого наследуются все классы).
Теперь я хочу динамически создавать экземпляр из файла XML и, следовательно, нуждаться в доступе к свойствам. Я сделал правило, что любой XML-экземплярный класс должен реализовать магический метод __set()
и поэтому может быть создан динамически. Вместо того, чтобы внедрять его в каждый класс, который может быть порожден однажды, я решил сделать их наследуемыми от класса с именем вроде class Spawnable { }
, который предоставляет необходимый метод __set.