PHP 中的数组访问 -- 通过引用分配偏移
首先,引用 ArrayAccess::offsetSet()
上的 ole' 手册:
在赋值中,此函数不是通过引用调用的,也不会间接更改数组维度,而数组维度重载了 ArrayAccess(间接地不是通过直接更改维度,而是通过更改子维度或子属性或通过引用另一个变量来分配数组维度来实现的)。相反,调用 ArrayAccess::offsetGet()。仅当该方法通过引用返回时,操作才会成功,这仅在 PHP 5.3.4 之后才有可能。
我对此有点困惑。这似乎表明(从5.3.4开始),可以在实现类中定义通过引用返回,从而通过引用处理赋值。offsetGet()
所以,现在是一个测试片段:
(忽略缺少验证和 isset()
检查)
class Test implements ArrayAccess
{
protected $data = array();
public function &offsetGet($key)
{
return $this->data[$key];
}
public function offsetSet($key, $value)
{
$this->data[$key] = $value;
}
public function offsetExists($key) { /* ... */ }
public function offsetUnset($key) { /* ... */ }
}
$test = new Test();
$test['foo'] = 'bar';
$test['foo'] = &$bar; // Fatal error: Cannot assign by reference to
// overloaded object in
var_dump($test, $bar);
好吧,所以这不起作用。那么这个手册笔记指的是什么呢?
原因
我想允许通过数组运算符通过引用分配给实现的对象,如示例代码段所示。我以前调查过这个问题,我不认为这是可能的,但是由于不确定性而回到这一点,我(重新)在手册中发现了这一点。现在我只是感到困惑。ArrayAccess
更新:当我点击时,我意识到这可能只是通过引用另一个变量来指代赋值,例如.如果是这样的话,那么道歉;尽管知道如何(如果可能的话)通过引用来分配重载对象将是很棒的。Post Your Question$bar = &$test['foo'];
进一步详细说明:归根结底,我希望具有以下方法别名:
isset($obj[$key]); // $obj->has_data($key);
$value = $obj[$key]; // $obj->get_data($key);
$obj[$key] = $value; // $obj->set_data($key, $value);
$obj[$key] = &$variable; // $obj->bind_data($key, $variable);
// also, flipping the operands is a syntactic alternative
$variable = &$obj[$key]; // $obj->bind_data($key, $variable);
unset($obj[$key]); // $obj->remove_data($key);
就 、 、 和 而言,它们与 受支持的方法没有问题。绑定功能是我不知所措的地方,我开始接受ArrayAccess和PHP的限制只是禁止这样做。has
get
set
remove
ArrayAccess