0

我阅读了很多关于ArrayAccessPHP 接口的过去问题以及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';
4

3 回答 3

1

在这段代码中:

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错误,因此应该被禁止。

于 2017-04-28T12:28:55.457 回答
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;
}
于 2014-11-24T19:22:31.920 回答
0

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

php手册->第二个注释

于 2014-11-24T19:18:20.510 回答