PHP ArrayAccess - 带参考的多维数组和offsetGet

时间:2014-11-24 19:11:35

标签: php arrayaccess

我阅读了很多关于ArrayAccess PHP接口及其可以返回引用的方法offsetGet的过去的问题。我有一个实现此接口的简单类,它包装了array类型的变量。 offsetGet方法返回引用,但是我收到错误Only variable references should be returned by reference。为什么呢?

class My_Class implements ArrayAccess {
    private $data = array();

    ...

    public function &offsetGet($offset) {
        return isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
    }

    ...
}

我希望能够在这个类中使用多维数组:

$myclass = new My_Class();

$myclass['test'] = array();
$myclass['test']['test2'] = array();
$myclass['test']['test2'][] = 'my string';

3 个答案:

答案 0 :(得分:0)

我认为这是因为你要返回表达式的结果,而不是变量。 尝试编写if语句并返回实际变量。

请参阅php manual -> second note

答案 1 :(得分:0)

方法'& offsetGet'返回一个变量的引用(指针)。

您需要将方法签名从'& offsetGet'修改为'offsetGet'或使用变量来保存返回值。

// modify method signiture
public function offsetGet($offset) {
    return isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
}

// or use a variable to hold the return value.
public function &offsetGet($offset) {
    $returnValue = isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
    return $returnValue;
}

答案 2 :(得分:0)

在此代码中:

public function &offsetGet($offset) {
    $returnValue = isset( $this->data[ $offset ] ) ? $this->data[ $offset ] : null;
    return $returnValue;
}

$returnValue$this->data[$offset]的副本,而不是参考。

你必须使自己成为一个引用,为此你必须用if语句替换三元运算符:

public function &offsetGet($offset) {
    if (isset($this->data[$offset]) {
        $returnValue &= $this->data[$offset]; // note the &=
    }
    else {
        $returnValue = null;
    }
    return $returnValue;
}

应该这样做。

对于不存在的情况,我宁愿抛出一个异常,就像你在询问一个不存在的数组键时得到的异常一样。 由于您返回的值不会成为参考,

$myclass['non-existing']['test2'] = array();

可能会抛出indirect overloaded modification错误,因此应该被禁止。