Многомерный ArrayObject

Есть ли способ реализовать класс с многомерным доступом к массиву? Я хочу что-то вроде

$obj = new MultiArrayObject();
$obj['key']['subkey'] = 'test';
echo $obj['key']['subkey']; //expect 'test' here

1 ответ

Решение

Не существует синтаксиса, с помощью которого класс может перехватывать несколько уровней доступа к массиву, но вы можете сделать это по одному уровню за один раз, реализовав 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'], на котором вы можете установить данные.

Однако это не позволит вам различать сеттеры и геттеры; все значения всегда будут создаваться неявно, как только вы получите к ним доступ, что может сделать поведение этого объекта немного странным.

Другие вопросы по тегам