
PHP 中数组作为函数参数时,默认按值传递,但实际行为取决于数组大小和 PHP 版本,核心在于“写时复制(Copy-on-Write)”机制——并非真正每次都复制,而是在函数内修改数组时才触发复制。
默认是值传递,但底层有优化
调用函数时传入数组,PHP 不会立即复制整个数组内存,而是先让函数参数与原数组共享同一份数据结构(zval),只要不修改该数组,就共用;一旦在函数内部对数组进行赋值、添加、删除等写操作,才会真正复制一份副本。这意味着:读多写少的场景下,性能开销极小。
显式按引用传递可避免复制
如果明确希望函数内修改影响原始数组,需在参数前加 & 符号声明引用:
- // 正确:修改 $arr 会影响外部变量
- function modifyArray(&$arr) { $arr[] = 'new'; }
- // 调用后原数组末尾增加元素
注意 unset() 和 foreach 中的引用陷阱
即使参数未声明为引用,在函数内用 foreach (&$v) 或 unset() 操作数组,也可能意外触发写时复制或改变原数组(尤其 PHP 7.0+ 对引用语义更严格)。常见误区:
立即学习“PHP免费学习笔记(深入)”;
- 在 foreach 中使用 &$item 修改元素,若数组本身是值传递,修改的是副本,不影响外部;但若该数组后续被其他变量引用,行为可能更复杂
- unset($arr[0]) 在函数内执行,会触发复制,外部数组不受影响
大数组场景建议主动控制传递方式
处理 MB 级别数组时,应根据需求选择:
- 只读操作 → 保持默认(安全且高效)
- 需修改原始数组 → 显式传引用(&$arr),避免无谓内存占用
- 需返回新数组 → 仍用值传递,函数内操作后 return,语义清晰








