Я играю с ArrayObject уже несколько дней, но есть хитрость, которую я не могу сделать.
Что я хочу сделать :
MyClass extends ArrayObject {
public function __construct($input = []) {
parent::__construct($input, self::ARRAY_AS_PROPS);
}
}
$a = new MyClass();
$a->foo = 'bar';
var_dump($a->getArrayCopy()); // there should be only one key : "foo"$a->bar->baz = 'foo';
var_dump($a->getArrayCopy()); // there should be only two keys : "foo", "bar"echo get_class($a->bar) . "\n"; // should be MyClass
Но $ a-> bar — это класс stdClass, и у меня есть хорошее предупреждение в бонусе
Если я отключу флаг ARRAY_AS_PROPS и переопределю методы __get и __set, я близок:
function __get($key) {
if (! $this->offsetExists($key)) {
$this->offsetSet($key, new self);
}
return $this->offsetGet($key)
}
Но тогда у меня есть эта проблема:
$a = new MyClass();
$a->foo = 'bar';
var_dump($a->getArrayCopy()); // there is one key ("foo") which is correct
// but when I do anything with the key without affecting some data
isset($a->bar);
var_dump($a->getArrayCopy()); // Now I also have the key "bar" which is not correct
Любое предложение ?
Задача ещё не решена.
Других решений пока нет …