PHP引用传递未达预期的原因及解决方法
PHP引用传递与返回引用的行为差异问题
先看这段PHP代码:
class FOO { public $v = []; function &refv1() { return $this->v[1]; } function refv2(&$ref) { $ref = &$this->v[2]; } } $FOO = new FOO(); // 这段代码正常工作 $acc = &$FOO->refv1(); $acc = '5'; echo $FOO->v[1]; // 输出 5 // 这段代码无法生效 $bcc = null; $FOO->refv2($bcc); $bcc = '10'; echo $FOO->v[2]; // 未被设置!
上述两种方式逻辑相近,第一种通过返回引用的方式能够正常修改数组元素,但第二种通过传递引用并在函数内为其赋值引用的方式却无法生效。请问这是为什么?如何让传递的引用像第一个函数那样成为数组的访问器?
答案与解释
PHP的引用语法存在特殊的行为逻辑,并非直观的“引用传递”。你可能会觉得像下面这样的代码:
$c = &f(); function &f() { return $a[b]; }
等同于$c = &$a[b];,但实际上它的行为更接近:
$a[b] = &$temp; $c = &$temp;
回到原问题,要让第二个函数的行为与第一个一致,需要修改refv2函数:
function refv2(&$ref) { $ref = $this->v[2]; $this->v[2] = &$ref; }
内容的提问来源于stack exchange,提问作者rhavin
相关产品推荐
相关产品推荐

