讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋雪吖_8591

秋雪吖_8591

发布时间: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']本身不是变量,而是表达式,直接加&会失败。

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

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

立即学习“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++是语法错误

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

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

相关专题

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

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

320

2023.12.20

php中foreach用法
php中foreach用法

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

798

2025.12.04

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

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

16040

2023.12.04

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

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

1183

2024.02.23

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

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

8830

2025.06.11

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

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

3502

2025.08.07

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

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

1818

2023.08.03

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

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

2884

2023.09.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn