2012-05-22 60 views
2

我想存儲一個數組並使用擴展ArrayObject的自定義類來操作該數組。使用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而不是弗雷德。有沒有什麼辦法可以在不改變上述四條線的情況下工作?

回答

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; 
    } 
} 
+0

這問題是數組存儲作爲對象,所以如果我設定的值的陣列,那麼我之前調用'指定者()'循環他們。 – fire

+0

@fire實現迭代器和可數嗎? – madflow