Есть ли способ реализовать класс с многомерным доступом к массиву? Я хочу что-то вроде
$obj = new MultiArrayObject();
$obj['key']['subkey'] = 'test';
echo $obj['key']['subkey']; //expect 'test' here
Нет синтаксиса, с которым класс может перехватывать множественный уровни доступа к массиву, но вы можете сделать это по одному реализация ArrayAccess
интерфейс:
class MultiArrayObject implements ArrayAccess {
protected $data = [];
public function offsetGet($offset) {
if (!array_key_exists($offset, $this->data)) {
$this->data[$offset] = new $this;
}
return $this->data[$offset];
}
/* the rest of the ArrayAccess methods ... */
}
Это создаст и вернет новое вложенное MultiArrayObject
как только вы получите доступ $obj['key']
, на котором вы можете установить данные.
Однако это не позволит вам различать сеттеры и геттеры; все значения всегда будут создаваться неявно, как только вы получите к ним доступ, что может сделать поведение этого объекта немного странным.
Других решений пока нет …