0

0

php函数参数如何传递_php函数参数传递方式【类型】

星夢妙者

星夢妙者

发布时间:2026-03-01 19:31:33

|

810人浏览过

|

来源于php中文网

原创

php函数参数默认按值传递,对象因存储标识符而表现类似引用;需修改外部变量时才用&声明引用参数,且调用时应显式加&以提升可读性与安全性。

php函数参数如何传递_php函数参数传递方式【类型】

PHP 函数参数是传值还是传引用?

PHP 默认所有参数都是按值传递,但对象例外——对象变量本身是“引用的句柄”,所以修改对象属性会反映到原对象上,而重新赋值 $obj = new StdClass() 不会影响外部变量。

  • 标量(intstringbool)、数组、资源默认复制一份,函数内改不影响调用方
  • 对象(stdClass、自定义类实例)传的是对象标识符(handle),不是内存地址,也不是完全的引用语义
  • 如果真要让标量或数组被函数修改后影响外部,必须显式用 & 声明引用参数:function foo(&$arr) { $arr[] = 1; }
  • foreach 遍历时加 & 也能改原数组,但容易漏掉 unset($v) 导致后续循环出错

什么时候必须加 & 符号?

只有当你需要函数内部直接修改调用方的变量值,并让这个修改在函数返回后依然生效时,才需要 &。这不是性能优化手段,也不是“更高级”的写法。

  • 常见场景:批量处理并更新多个配置项,比如 parse_ini_file 的替代实现中解析后直接填充传入的 &$config
  • 错误用法:以为加 & 能提升大数组性能——PHP 的写时复制(Copy-on-Write)机制下,不修改时根本不会复制,加引用反而可能阻止优化
  • 函数签名一旦用了 &,调用时不能传表达式(如 foo(&get_array()) 报错),只能传变量:$x = []; foo($x);
  • PHP 8.1+ 对引用参数有更严格检查,传 null 或未定义变量会触发 E_WARNING

对象传参为什么看起来像引用?

因为 PHP 中对象变量存储的是指向对象容器的标识符,类似指针但不可运算。你传的是这个标识符的副本,两个变量指向同一块对象数据区。

Fotor AI Image Generator
Fotor AI Image Generator

Fotor 平台的 AI 图片生成器

下载
  • $a->prop = 'new' 会影响 $b(如果 $b = $a
  • $a = new StdClass() 不会影响 $b,这只是把新标识符赋给 $a
  • ⚠️ clone $a 才真正断开关联;unset($a) 只销毁变量,对象本身还在,直到所有引用消失
  • 注意 json_encode($obj) 这类函数会触发完整深拷贝逻辑,跟传参机制无关

函数定义里写 & 但调用时不加 &,会怎样?

语法上完全合法,PHP 会自动将实参转为引用。但这是隐式行为,可读性差,且容易掩盖 bug。

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

  • 调用方完全看不出这个参数会被修改,比如 filter_input_array(INPUT_GET, $rules, $output) 如果第三个参数是 &$output,调用者可能根本没意识到 $output 已被重写
  • 如果传的是字面量(foo(42))或表达式(foo($x + 1)),PHP 7.4+ 会报 Cannot pass parameter by reference
  • IDE 和静态分析工具(如 PHPStan)通常会警告这种“不透明”的引用传递,建议显式在调用处也加 &(虽然语法不要求)

最常被忽略的是:引用参数和对象行为混在一起时,调试难度陡增。比如一个函数同时接受 &$data$obj,你以为只改了 $data,结果 $obj 的某个属性也被动变了——那大概率是 $obj 内部引用了 $data,而不是传参机制的问题。

相关文章

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

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

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

890

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

248

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

947

2024.03.01

php中foreach用法
php中foreach用法

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

202

2025.12.04

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

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

200

2023.12.04

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

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

313

2024.02.23

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

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

289

2025.06.11

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

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

170

2025.08.07

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

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

精品课程

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

共137课时 | 12.7万人学习

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

共6课时 | 11.3万人学习

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

共13课时 | 1.0万人学习

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

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