扩展PHP ArrayObject的不能正常工作
-
23-09-2019 - |
题
我试图延长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);
错误消息说,“超载财产的间接修改”,并知道是什么意思,这是一件好事 - 你不得以任何方式修改为空值
不隶属于 StackOverflow