php数组默认按值传递,得益于写时复制机制,安全高效;需修改原数组时才显式引用,并通过命名和文档明确意图;超大数组应改用迭代器或生成器。

PHP 中数组作为参数传递时,核心在于明确传值还是传引用、避免意外修改、兼顾性能与可读性。默认按值传递,但大数组可能影响性能;显式引用虽高效,却容易引发副作用。关键不是“怎么传”,而是“为什么这样传”。
优先按值传递,除非有明确理由用引用
PHP 7+ 对数组实现了写时复制(Copy-on-Write)机制:函数内不修改数组时,不会真正复制内存;一旦赋值、追加或修改键值,才触发复制。这意味着大多数场景下,按值传递既安全又高效。
- 无需手动加
&,避免调用方意外被修改 - 函数签名清晰表达“输入不可变”,利于协作和测试
- 例如:
function filterActiveUsers(array $users): array { ... }—— 调用者放心传入原始数据
需要修改原数组时,显式使用引用并命名体现意图
仅当函数职责就是“就地更新”(如批量设置状态、填充缓存字段),才用引用。此时名称和文档必须明确传达这一行为。
- 参数名建议带
&提示,如array &$items - 函数名宜含
mutate、fill、normalizeInPlace等动词 - 文档中注明 “Modifies the input array directly”
- 避免混用:不要在一个函数里既返回新数组又修改原数组
处理超大数组时,考虑迭代器或生成器替代
若数组过大(如数万条记录),即使写时复制也可能触发内存峰值。此时应跳出“传整个数组”的思维:
基于Intranet/Internet 的Web下的办公自动化系统,采用了当今最先进的PHP技术,是综合大量用户的需求,经过充分的用户论证的基础上开发出来的,独特的即时信息、短信、电子邮件系统、完善的工作流、数据库安全备份等功能使得信息在企业内部传递效率极大提高,信息传递过程中耗费降到最低。办公人员得以从繁杂的日常办公事务处理中解放出来,参与更多的富于思考性和创造性的工作。系统力求突出体系结构简明
立即学习“PHP免费学习笔记(深入)”;
- 改用
Traversable或Iterator接口作参数类型,降低内存占用 - 对海量数据,优先用
Generator分批处理:function processRows(Generator $rows): void - 数据库结果集尽量用 PDO::FETCH_ASSOC + foreach 流式读取,而非
fetchAll()全部载入
类型声明与防御性检查要到位
无论传值还是传引用,都应借助 PHP 类型系统增强健壮性:
- 始终声明
array类型(PHP 7.1+ 支持)或更精确的string[]、array<int user></int>(PHP 8.1+) - 必要时用
is_array()+array_is_list()或array_key_exists()校验结构 - 避免依赖
func_get_args()或松散的mixed参数——模糊接口是 bug 温床
不复杂但容易忽略:一次明确的传递方式 + 一个准确的函数名 + 一句实在的文档说明,比技巧更重要。









