通八洲科技

PHP 中如何在函数内持久化修改引用变量的指向

日期:2026-01-01 00:00 / 作者:聖光之護

php 函数参数虽支持引用传递,但无法直接在函数内部永久改变调用方变量的引用目标;需结合返回引用(`&function()`)并显式重新赋值,才能实现引用链的延续。

在 PHP 中,&$param 形式的参数允许函数修改变量所指向的值(如数组元素、对象属性),但不能改变调用方变量本身的引用绑定关系。这是因为 PHP 的引用传参本质上是“传递引用的副本”——函数内对 $p 重新赋值为 &$p['x'],仅修改了该参数局部符号的绑定,而不会回溯更新外部变量 $p 的引用目标。这正是原代码中 $p 在函数返回后“恢复”指向 $a 的根本原因。

要实现引用目标的持久切换,必须采用返回引用 + 显式重绑定的组合方案:

function &f(&$p) {
    $p['x'] = [];      // 确保嵌套结构存在
    $p = &$p['x'];      // 本地重绑定(仅作用于函数内)
    return $p;          // 返回 $p['x'] 的引用(注意 & 在 function 前)
}

$a = [];
$p = &$a;
$p = &f($p);  // 关键:用 & 接收返回引用,完成外部变量重绑定
$p['y'] = 3;

echo json_encode($a); // 输出: {"x":{"y":3}}

关键要点解析:

⚠️ 注意事项:

综上,PHP 中不存在“直接修改外部引用绑定”的机制,但通过显式返回引用并强制重赋值,可安全、清晰地达成等效效果。这是理解 PHP 引用语义与内存模型的重要实践范例。