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; ?>
】
相关推荐
- windows 10专注助手怎么关闭_window
- Python文件和流处理指南_高效读写大体积数据文
- Python数据挖掘进阶教程_分类回归与聚类案例解
- php嵌入式日志记录怎么实现_php将硬件数据写入
- LINUX如何删除用户和用户组_Linux use
- 如何在 ACF 中正确更新嵌套多层 Group 字
- MAC怎么使用表情符号面板_MAC Emoji快捷
- 如何使用 Selenium 正确获取篮球参考网站球
- c++ stringstream用法详解_c++字
- Python类装饰器使用_元编程解析【教程】
- Win11怎么打开注册表_Windows 11注册
- Win11怎么设置应用分屏_Windows11贴靠
- 如何在Golang中理解指针比较_Golang地址
- 如何在JavaScript中动态拼接PHP的bas
- Win11 explorer.exe频繁崩溃_修复
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Win11开始菜单打不开_修复Windows 11
- php下载安装后swoole扩展怎么安装_异步框架
- Win10如何优化内存使用_Win10内存优化技巧
- php485读数据时阻塞怎么办_php485非阻塞
- Windows11怎样开启游戏模式_Windows
- 如何使用 Python 合并文件夹内多个 Exce
- Python 模块的 __name__ 属性如何由
- 如何在 Go 中正确测试带 Cookie 的 HT
- Win11怎么关闭用户账户控制UAC_Window
- Bpmn 2.0的XML文件怎么画流程图
- Win11怎么关闭自动修复_跳过Win11开机自动
- Flask 表单数据通过 SMTP 发送邮件的完整
- 如何在JavaScript中动态拼接PHP的bas
- Win10系统更新错误0x80240034怎么办
- C++如何使用std::transform批量处理
- Windows10系统怎么查看系统版本_Win10
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- Win11怎么把图标拖到任务栏_Win11固定应用
- Python与Docker容器化部署实战_镜像构建
- Win11怎么更改输入法顺序_Win11调整语言首
- c++如何实现一个高性能的环形队列(Ring Bu
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Win11如何设置开机自动联网 Win11宽带连接
- Win11怎么设置默认图片查看器_Windows1
- C#如何使用Channel C#通道实现异步通信
- Drupal 中 HTML 链接被双重转义导致渲染
- Win10系统映像怎么恢复 Win10使用系统映像
- c++输入输出流 c++ cin与cout格式化输
- c++23 std::expected怎么用 c+
- Win11怎么卸载Photos应用_Win11卸载
- PHP的FastAdmin架构适合二次开发吗_特点
- Win11怎么查看显卡温度 Win11任务管理器查
- 如何在 Laravel 中通过嵌套关联关系进行 o
- php怎么连接数据库_MySQL数据库连接的基础代

量引用)。
QQ客服