0

0

PHP如何通过引用传递参数_PHP引用传递参数教程【教程】

雪夜

雪夜

发布时间:2026-02-25 19:27:12

|

801人浏览过

|

来源于php中文网

原创

php函数默认按值传递,修改不影响原变量;要修改外部变量,必须在函数定义和调用时都加&,缺一不可。

php如何通过引用传递参数_php引用传递参数教程【教程】

PHP函数里改不了变量值?检查是不是忘了加&

PHP默认按值传递参数,函数内部改的是副本,原变量不受影响。想让函数修改外部变量,必须在定义和调用时都显式加&——缺一不可。

常见错误现象:function swap($a, $b) { $tmp = $a; $a = $b; $b = $tmp; } 调用后$x$y完全没变;或者只在函数定义写&$a,调用时漏了&,PHP 8.0+会直接报Deprecated: Call-time pass-by-reference警告。

  • 定义函数时:参数前加&,如function modify(&$data)
  • 调用时:实参前也要加&,如modify(&$user['name'])modify(&$config)
  • 不能对表达式、字面量或临时结果取引用,比如modify(&getArray()[0])modify(&'hello')会报Cannot pass parameter by reference

数组元素能单独传引用吗?可以,但要注意语法细节

给数组某个键传引用是高频需求,比如批量处理配置项、递归修改嵌套结构。但$arr['key']本身不是变量,而是表达式,直接加&会失败。

正确做法是先用变量承接该元素,再传引用:

医真AI+开放平台
医真AI+开放平台

医真AI+ 医学AI开放平台

下载

立即学习PHP免费学习笔记(深入)”;

$item = &$config['database']['host'];
updateConfig($item); // $config['database']['host'] 现在已被修改
  • 不能写updateConfig(&$config['cache']['ttl'])——PHP解析器不认这种“动态左值”
  • 如果要循环修改多个数组元素,用foreach ($arr as &$v),但记得结束后unset($v),否则$v仍指向最后一个元素,下次循环可能意外覆盖
  • $_POST$_GET这类超全局数组的元素,同样适用该规则,但不建议直接改它们,容易引发逻辑混乱

对象为什么不用&也能“像引用一样”工作?

PHP 5.0+起,对象变量存储的是对象标识符(类似指针),赋值或传参时复制的是这个标识符,不是对象本身。所以function process($obj) { $obj->prop = 'new'; }确实能改原始对象属性——但这不是引用传递,是对象模型的天然行为。

  • 对对象用&$obj反而多余,除非你真想让函数替换整个对象实例(比如$obj = new Logger();
  • 资源类型(如fopen()返回的resource)行为类似对象,也不需要&
  • 字符串、数组、整数等标量类型,没有这种“自动共享”,必须靠&才能穿透作用域

引用传参会影响性能或产生副作用吗?

引用本身开销极小,但容易掩盖数据流向,尤其在深层调用链中。真正的问题不在性能,而在可维护性。

  • 被引用的变量生命周期会被延长——只要还有引用存在,它就不会被GC回收,大数组或大对象长期驻留内存
  • 函数签名不带&时,调用者默认认为“安全无副作用”;一旦加了&,就必须检查所有调用点是否预期被修改
  • PHP 7.4+支持箭头函数,但箭头函数不能使用引用参数,fn(&$x) => $x++是语法错误

复杂点在于:引用不是“开关”,而是一条隐式连接线。你得同时盯住函数定义、每次调用、以及被传入的变量是否还在其他地方被读写——稍不注意,就变成“谁动了我的变量”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.12.20

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

182

2025.12.04

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

286

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

167

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

638

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

218

2023.09.04

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号