【问题标题】:Extended PHP ArrayObject Does Not Work Properly扩展的 PHP ArrayObject 无法正常工作
【发布时间】:2010-02-27 19:56:48
【问题描述】:

我正在尝试扩展 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
        (
        )

)

如何让我的扩展类使用多维数组?

【问题讨论】:

    标签: php spl arrayobject


    【解决方案1】:

    对我来说,sn-p #1 相当糟糕,而不是 #2。您正在访问一个不存在的元素,而代码 #2 正是您所期望的:警告。 #1 有点“有效”的原因是一个怪癖,或者是 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);  
    

    错误消息显示“间接修改重载属性”,无论这意味着什么,这是一件好事 - 您不允许以任何方式修改 null 值。

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      相关资源
      最近更新 更多