2010-02-27 37 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); 

错误消息说,“超载财产的间接修改”,而且,这意味着什么,这是一件好事 - 你不得以任何方式修改空值。