PHP 7.3+ 的参数展开(...$arr)是将索引数组解包为独立函数参数的语法特性,支持自定义函数、内置函数及类方法调用,要求数组元素个数与形参一致且必须位于参数末尾,替代了 call_user_func_array 等冗余写法。

PHP 7.3+ 并没有专门叫“数组解构”的内置函数,但你实际想用的,是参数展开(Argument Unpacking)这一语言特性——它通过 ... 操作符,把数组“解开”成独立参数传给函数,效果类似解构,但本质是调用时的语法糖。
核心用法:用 ... 把索引数组展开为函数参数
必须满足两个前提:函数形参个数与数组元素个数一致,且数组是索引数组(键为 0,1,2…)。
- 定义函数时无需特殊写法,照常声明参数即可
- 调用时在数组变量前加
...,例如func(...$arr) - 不支持直接对关联数组展开传参(键名会被忽略,只按值顺序传递)
能用在哪几类函数上?
几乎所有接受多个明确参数的函数都支持,包括:
- 自定义函数(最常用)
- PHP 内置函数,如
array_merge(...$arrays)、min(...$numbers)、max(...$numbers) - 类方法调用(含构造函数),例如
new DateTime(...$args)(需参数匹配)
常见错误和避坑点
看似简单,但容易踩坑:
立即学习“PHP免费学习笔记(深入)”;
-
数组长度不匹配会报致命错误:比如函数要 3 个参数,却传入只有 2 个元素的数组 →
Fatal error: Uncaught ArgumentCountError -
不能展开 null 或非数组/Traversable 类型:必须是数组或实现了
Traversable的对象 -
不能放在参数列表中间:展开项必须位于参数末尾,例如
foo($a, ...$rest)可以,foo(...$rest, $b)会报错
对比传统方式,为什么推荐用 ...?
它替代了过去繁琐又难维护的做法:
- 不用再写
call_user_func_array('func', $arr)—— 语法冗长、IDE 不友好、无类型提示 - 不用手动写
func($arr[0], $arr[1], $arr[2])—— 易出错、不可扩展、无法静态分析 - 支持类型声明(如
function sum(int ...$nums)),PHP 7.3+ 还能做编译期优化,性能更好



















