PHP 中如何在函数内持久修改引用变量所指向的目标
技术百科
心靈之曲
发布时间:2026-01-01
浏览: 次 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}}⚠️ 注意事项:
- return $p 中的 $p 必须是可引用的表达式(如变量、数组元素),不能是临时值(如 return $p['x'] 不加 &$p['x'] 赋值则无效);
- 调用端必须使用 &f($p) 语法,缺省的 = 赋值会触发值拷贝,破坏引用语义;
- 此方案依赖 PHP 的“引用返回”机制,仅适用于 PHP 5.0+,且在严格模式下更需注意变量生命周期(避免返回局部变
量引用)。
总结:PHP 中无法通过纯参数传递“修改引用目标”,但可通过「返回引用 + 显式重赋值」这一组合模式达成等效效果。它本质是将引用管理权交还给调用方,既符合语言设计逻辑,又保持了内存安全与行为可预测性。
# 的是
# 是一个
# 这一
# 可通过
# 适用于
# 绑定
# 并由
# 而非
# 并将
# js
# json
# 指针
# 栈
# function
# php
# 局部变量
# 严格模式
# 不加
# 形参
# php 函数
# 引用传递
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php错误怎么开启_display_errors与
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- c++23 std::expected怎么用 c+
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- MAC怎么使用表情符号面板_MAC Emoji快捷
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Python多线程使用规范_线程安全解析【教程】
- Golang如何遍历目录文件_Golang fil
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- MAC怎么一键隐藏桌面所有图标_MAC极简模式切换
- windows如何修改文件默认打开方式_windo
- Win11怎么卸载Photos应用_Win11卸载
- Win10如何更改用户账户控制_Windows10
- Mac如何备份到iCloud_Mac桌面与文稿文件
- Windows10怎样连接蓝牙设备_Windows
- php删除数据怎么清空表_truncate与del
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- Win11用户账户控制怎么关_Win11关闭UAC
- Win11怎么用设置清理回收站_Win11设置清理
- Win11右键反应慢怎么办 Win11优化右键菜单
- XAMPP 启动失败(Apache 突然停止)的终
- Linux怎么禁止Root用户远程登录_Linux
- Go语言中slice追加操作的底层共享机制解析
- 如何使用Golang理解结构体指针方法接收者_Go
- 如何使用Golang实现跨域请求支持_Golang
- mac怎么安装pip_MAC Python pip
- 企业SEO优化选择网站建设模板的技巧
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- 如何在Golang中使用内置函数_Golangle
- Win11怎样安装剪映专业版_Win11安装剪映教
- php485返回数据不完整怎么办_php485数据
- 短链接怎么用php还原_从基础原理到代码实现教学【
- Mac的访达(Finder)怎么用_Mac文件管理
- Windows10电脑怎么设置电源按钮_Win10
- Win10电脑怎么设置网络名称_Windows10
- c++的mutex和lock_guard如何使用
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- Windows10蓝屏代码DPC_WATCHDOG
- c++怎么用jemalloc c++替换默认内存分
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- Python音视频处理高级项目教程_FFmpegP
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- Win11怎么清理C盘系统错误报告_Win11清理
- 如何使用Golang实现微服务状态监控_Golan
- c++如何用AFL++进行模糊测试 c++ Fuz
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- php485返回空数组怎么回事_php485数据接
- Win10如何更改网络连接_Windows10以太

量引用)。
QQ客服