PHP 5.6+ 使用 ... 定义可变参数函数,参数自动封装为数组且必须位于末尾;支持类型提示、IDE识别和静态分析;调用时可用 ... 展开数组,取代 func_get_args() 和 call_user_func_array()。

PHP 5.6+ 用 ...(三个点)定义可变参数函数,语法简洁、类型安全、IDE 支持好,取代了旧版的 func_get_args()。
定义可变参数函数
在参数名前加 ...,该参数自动接收所有剩余实参并封装为数组,必须放在参数列表末尾:
-
基础写法:
function sum(...$numbers) { return array_sum($numbers); }调用sum(1, 2, 3)→$numbers是[1, 2, 3] -
混合固定参数:
function greet($prefix, ...$names) { foreach ($names as $n) echo "$prefix$n\n"; }greet('Hi ', 'Alice', 'Bob')→ 输出两行问候 -
支持类型提示:
function concat(string ...$parts): string { return implode(' ', $parts); }传入非字符串会触发 TypeError
调用时展开数组
同样用 ... 把数组“打散”成独立参数,替代 call_user_func_array():
-
$arr = [10, 20, 30]; sum(...$arr);等价于sum(10, 20, 30) - 适用于代理调用:
function logAndCall($func, ...$args) { error_log("Calling $func"); return $func(...$args); } - 注意:只支持数组或可遍历对象;键名会被忽略,仅保留值顺序
常见注意事项
避免踩坑,保证代码健壮:
立即学习“PHP免费学习笔记(深入)”;
- 一个函数只能有一个
...参数,且必须是最后一个 - 不能在可变参数后声明其他参数,否则报 Parse Error
- 空调用
sum()时,$numbers是空数组[],不是null - 与默认参数共存时,未传值则取默认值,剩余参数才归入
...数组
对比 func_get_args()
老方式仍可用,但新语法更优:
-
func_get_args()无类型提示、IDE 难识别、性能略低、签名不直观 -
...在函数声明中明确表达意图,支持array、string等类型约束 - 静态分析工具(如 PHPStan)能准确推断
...参数结构,减少运行时错误



















