php函数默认值传递,形参是实参副本,修改不影响外部变量;加&声明引用参数后,形参与实参共享内存,修改直接影响原始变量;对象传参虽为值传递语义,但因传递handle而能修改属性。

PHP 函数默认按值传递,形参是实参的副本,修改不影响外部变量;加 & 声明引用参数后,形参与实参指向同一内存地址,函数内修改会直接改变原始变量。
值传递:安全隔离,各改各的
函数接收的是变量内容的一份拷贝,内部操作仅作用于这个副本。
- 整数、字符串、布尔值等标量类型:实实在在复制一份值
- 数组:默认也复制整个结构(PHP 7.4+ 引入了更智能的写时复制机制,但语义仍是值传递)
- 对象:虽是“值传递”,但传递的是对象标识符(handle),因此属性修改仍可见——这不是真正的值传递行为,而是对象模型的特殊性
- 函数调用后,原始变量保持不变,逻辑清晰、副作用可控
引用传递:共享内存,一改全改
必须在函数定义时用 &$param 显式声明,调用时传入的必须是**已命名的变量**。
- 允许函数直接修改外部变量,比如批量更新配置、填充返回数据、处理大数组避免拷贝开销
- 不能传字面量(如
func(123))、表达式(如func($a + $b))或函数调用结果(如func(getData())),否则报 Parse error - 一旦启用,需格外注意副作用——调用方可能没意识到变量已被函数悄悄改掉
对象参数:表面值传,实际共用实例
PHP 5+ 中,对象变量存储的是 handle(类似指针),传参时复制的是这个 handle,而非对象本身。
- 修改对象属性(
$obj->name = 'new')会影响外部变量,因为 handle 指向同一对象实例 - 但若在函数内重新赋值整个变量(
$obj = new StdClass()),只改变形参指向,不影响外部变量 - 所以无需加 & 就能“间接”实现引用效果,但本质仍是值传递语法
怎么选:优先 return,慎用引用
多数场景推荐值传递 + return 返回新值,函数更纯粹、易测试、无副作用。
- 需要修改原变量时才考虑引用,例如:解析日志并原地填充结果数组、更新全局计数器
- 处理超大数组或字符串且确认需就地修改时,引用可节省内存和时间
- 混合使用更灵活:部分参数值传(输入),部分加 &(输出),再配合 return(计算结果)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











