我正在尝试扩展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
(
)
)
使扩展类使用多维数组需要什么?
答案 0 :(得分:1)
对我而言,#1片段相当破碎,而不是#2。您正在访问一个不存在的元素,代码#2给出了您所期望的内容:警告。 #1 kinda“工作”的原因是一个怪癖,或两个怪癖的PHP。首先,当你在null上应用[] =运算符时,这个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);
错误消息显示“间接修改重载属性”,无论这意味着什么,这都是好事 - 不允许以任何方式修改空值。