2010-02-27 42 views
2

我想擴展SPL ArrayObject,但我遇到了一點麻煩。使用未修飾的ArrayObject的,此代碼的工作:擴展的PHP ArrayObject不能正常工作

$a = new ArrayObject(); 
$a[1][2] = 'abc'; 
print_r($a); 

得到這樣的輸出:

ArrayObject Object 
(
    [storage:ArrayObject:private] => Array 
     (
      [1] => Array 
       (
        [2] => abc 
       ) 

     ) 
) 

但是如果我延伸ArrayObject的和重載offsetGet方法

class ExtendedArray extends ArrayObject { 
    function offsetGet($i) { 
     return parent::offsetGet($i); 
    } 
} 

$a = new ExtendedArray(); 
$a[1][2] = 'abc'; 
print_r($a); 

它失敗,那麼這樣的:

ExtendedArray Object 
(
    [storage:ArrayObject:private] => Array 
     (
     ) 

) 

如何讓我的擴展類使用多維數組需要什麼?

回答

1

對我而言,片段#1相當破碎,而不是#2。你正在訪問一個不存在的元素,並且代碼#2會給你一個正確的結果:一個警告。爲什麼#1有點「工作」是一個怪癖,或兩個PHP的怪癖。首先,當你在null上應用[] =運算符時,這個空值「神奇地」變成一個數組 - 沒有單獨的解釋器警告。

$a = null; 
$a[1] = 'foo'; // "works" 
print_r($a); 

其次,此(有意或無意)不適用於從__get或offsetGet返回的空值。

class foo { 
    function __get($s) { return null; } 
} 

$a = new foo; 
$a->x[1] = 'foo'; // error 
print_r($a); 

錯誤消息說,「超載財產的間接修改」,而且,這意味着什麼,這是一件好事 - 你不得以任何方式修改空值。