
php 函数参数按引用传递时,仅能修改其值,无法直接改变调用方变量的引用目标;但通过返回引用并配合赋值操作,可实现引用链的重定向。
在 PHP 中,function f(&$p) 的形参 $p 是对传入变量的引用别名(alias),而非一个可独立重绑定的“引用指针”。这意味着:在函数内部执行 $p = &$p['x'] 确实会令 $p 指向 $p['x'](即 $a['x']),但该重绑定仅作用于函数栈帧内的局部别名,不会自动同步回外部变量。函数返回后,外部的 $p 仍维持原引用关系(即仍绑定到 $a),因此后续操作 $p['y'] = 3 实际写入的是 $a['y'],而非 $a['x']['y']。
要实现“持久化重绑定”,核心思路是:让函数返回一个新引用,并由调用方显式重新赋值。这需要两个关键改动:
- 函数声明必须使用 & 前缀(function &f(...)),表明返回值本身是一个引用;
- 调用时需用引用赋值语法 &f($p),并将结果重新绑定给 $p。
以下是正确实现:
function &f(&$p) {
$p['x'] = []; // 初始化子数组
$p = &$p['x']; // 本地重绑定(为后续 return 做准备)
return $p; // 返回对 $p['x'] 的引用
}
$a = [];
$p = &$a; // $p 初始引用 $a
$p = &f($p); // 关键:用函数返回的引用重新绑定 $p
$p['y'] = 3; // 此时 $p 指向 $a['x'],故写入 $a['x']['y']
echo json_encode($a); // 输出: {"x":{"y":3}}⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- return $p 中的 $p 必须是可引用的表达式(如变量、数组元素),不能是临时值(如 return $p['x'] 不加 &$p['x'] 赋值则无效);
- 调用端必须使用 &f($p) 语法,缺省的 = 赋值会触发值拷贝,破坏引用语义;
- 此方案依赖 PHP 的“引用返回”机制,仅适用于 PHP 5.0+,且在严格模式下更需注意变量生命周期(避免返回局部变量引用)。
总结:PHP 中无法通过纯参数传递“修改引用目标”,但可通过「返回引用 + 显式重赋值」这一组合模式达成等效效果。它本质是将引用管理权交还给调用方,既符合语言设计逻辑,又保持了内存安全与行为可预测性。











