我阅读了很多关于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';
答案 0 :(得分:0)
我认为这是因为你要返回表达式的结果,而不是变量。 尝试编写if语句并返回实际变量。
答案 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
错误,因此应该被禁止。