2

配列を格納し、ArrayObject を拡張するカスタム クラスを使用してその配列を操作しようとしています。

class MyArrayObject extends ArrayObject {
    protected $data = array();

    public function offsetGet($name) {
        return $this->data[$name];
    }

    public function offsetSet($name, $value) {
        $this->data[$name] = $value;
    }

    public function offsetExists($name) {
        return isset($this->data[$name]);
    }

    public function offsetUnset($name) {
        unset($this->data[$name]);
    }
}

問題は、私がこれを行う場合です:

$foo = new MyArrayObject();
$foo['blah'] = array('name' => 'bob');
$foo['blah']['name'] = 'fred';
echo $foo['blah']['name'];

出力は bob で、fred ではありません。上記の4行を変更せずにこれを機能させる方法はありますか?

4

1 に答える 1

3

これは ArrayAccess の既知の動作です (「PHP 通知: MyArrayObject のオーバーロードされた要素を間接的に変更しても効果がありません」...)。

http://php.net/manual/en/class.arrayaccess.php

これを MyArrayObject に実装します。

public function offsetSet($offset, $data) {
    if (is_array($data)) $data = new self($data);
    if ($offset === null) {
        $this->data[] = $data;
    } else {
        $this->data[$offset] = $data;
    }
} 
于 2012-05-22T14:04:53.673 に答える