我试图延长SPL ArrayObject的,但我已经打了一个小障碍。使用未修饰的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而破裂,而不是#2。你使用一个不存在的元素,并且代码#2为您提供准确人们所期望的东西:一个警告。为什么#1还挺“工程”的原因是一个怪癖,或php两个怪癖。首先,当你申请[] =在空操作,这是空“神奇地”变成了一个数组 - 未经解释的警告单字。

$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);  

错误消息说,“超载财产的间接修改”,并知道是什么意思,这是一件好事 - 你不得以任何方式修改为空值

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top