该错误表示PHP中使用...展开语法时传入了非数组且非Traversable类型的值。需检查变量是否为数组或可遍历对象,推荐用is_array($var) ? $var : []安全展开,或改用array_merge强制转数组处理。

这个错误提示“Only arrays and Traversables can be unpacked”说明你在使用 PHP 的数组展开语法(...)时,试图展开一个**非数组、非可遍历(Traversable)类型**的值,比如 null、string、int 或未定义变量。
检查展开项是否为有效数组或可遍历对象
PHP 7.4+ 要求所有用 ... 展开的参数必须是数组或实现了 Traversable 接口的对象(如 ArrayObject、Iterator 实例)。常见出错场景:
-
$arr = null; [...$arr]→ 报错 -
$arr = 'hello'; [...$arr]→ 报错 -
$arr = []; [...$arr, ...$maybeNull],其中$maybeNull是null→ 第二个展开报错
安全展开:先判断再展开
推荐在展开前做类型校验,避免运行时中断:
- 用
is_array($var) || $var instanceof Traversable判断 - 更简洁写法(PHP 7.4+):
[...($var ?? [])],但注意这仅对null有效,不适用于字符串等其他类型 - 稳妥做法:
[...(is_array($var) ? $var : [])]
替代方案:用 array_merge 避开展开限制
如果你不确定数据类型,又需要合并多个来源,array_merge 更宽容(会静默忽略非数组参数):
-
array_merge($a, (array)$b, (array)$c)—— 强制转数组,不会报错 - 注意:
array_merge对数字键会重排索引,关联键才保留;而展开语法保持原键名和顺序
PHP 7.3+ 中 Traversable 展开需特别注意
虽然 PHP 7.3 开始支持 Traversable 展开,但并非所有迭代器都“安全可展开”:
- 某些自定义迭代器可能未正确实现
Iterator或IteratorAggregate - 数据库结果集(如 PDOStatement)默认不可直接展开,需先
fetchAll() - 建议统一用
iterator_to_array($iter, false)转成数组再展开
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











