选对参数传递方式需按目标反推:需修改原变量用引用传递(如updatecount(&$total)),仅读取计算用值传递(默认,如formatname($name)),提升灵活性可加默认或可变参数(如logmessage($msg, $level='info')、sum(...$numbers)),php 8.0+推荐命名参数增强可读性(如createuser(name: 'tom', email: 'tom@example.com'))。

选对参数传递方式,关键看你想让函数做什么:是读取数据、修改原始变量、适配不同调用场景,还是处理不确定数量的输入。不用死记规则,按目标反推最自然的方式。
需要函数内部改外面的变量?用引用传递
当函数职责就是更新某个变量(比如批量调整用户状态、交换两个值、累加计数器),直接操作原变量最清晰。
- 定义时在参数前加 &,例如 function updateCount(&$total) { $total++; }
- 调用时只能传变量,不能传字面量或表达式,比如 updateCount($score) 可以,updateCount(100) 会报错
- 大数组或大对象传引用还能避免复制开销,但别为这点性能默认全加 & —— 可读性和安全性更重要
只是读数据、做计算、返回结果?用值传递(默认)
这是最安全、最常用的方式。函数拿到的是副本,怎么折腾都不会影响调用方的数据。
- 什么都不用写,PHP 默认就是值传递,比如 function formatName($name) { return ucfirst($name); }
- 适合字符串处理、数学运算、生成新数组等纯“输出型”逻辑
- 对象在 PHP 5+ 中虽默认按“对象引用语义”传递(即修改对象属性会影响原对象),但变量本身仍是值传递——要彻底隔离对象,得用 clone
想让函数更灵活、调用更省事?加默认参数或可变参数
不是所有参数每次都要填满。留出弹性空间,能减少重复函数定义,也方便后期扩展。
- 默认参数必须放参数列表末尾,比如 function logMessage($msg, $level = 'info', $timestamp = null)
- 注意:传 null 不等于“不传”,它会覆盖默认值;真想用默认值,就别传这个参数
- 参数个数不固定?用 ... 操作符,例如 function sum(...$numbers) { return array_sum($numbers); },调用时 sum(1, 2, 3, 4) 自动转成数组
PHP 8.0+ 有新选择:命名参数提升可读性
当函数参数多、含义抽象,或者只想填中间某几个参数时,命名参数比靠位置记忆靠谱得多。
- 调用时写成 createUser(name: 'Tom', email: 'tom@example.com'),顺序随意,跳过默认参数也直观
- 前提是函数定义支持(PHP 8.0+),且参数名在调用时明确写出
- 适合配置类、构造类、API 封装等强调意图的场景
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











