PHP 7.4+ 中 list() 报错因废除宽松语法,右侧为 null 或非数组时抛 TypeError;推荐用短数组解构 [$a, $b] = $arr ?? [null, null](PHP 7.1+),更安全、支持跳过元素和关联键名。

list 不是函数,是语言结构(language construct),不能被动态调用或作为变量传参 —— 这是绝大多数人踩坑的第一步。
为什么 list 在 PHP 7.4+ 里突然报错?
PHP 7.4 废除了对数组解构的宽松语法支持,尤其是 list($a, $b) = $arr 中若 $arr 不是真实数组(比如 null、false 或对象),会直接抛出 TypeError。更隐蔽的是:空数组或短数组不会报错,但未匹配的变量会被设为 null,容易埋下空指针隐患。
- PHP 7.3 及以前:
list($x, $y) = []→$x = null; $y = null(静默) - PHP 7.4+:同上行为不变,但若右侧是
null或非数组,则明确报错 - 推荐替代写法:
[$x, $y] = $arr ?? [null, null](仅 PHP 7.1+ 支持短数组语法)
list 和 [$a, $b] 解构赋值的区别在哪?
两者语义相同,但底层处理不同:list 是旧式语法,[$a, $b] 是“短数组解构”(array destructuring),属于现代 PHP 的统一语法糖。关键差异在可读性和扩展性:
-
list不支持跳过元素(如list(, $b) = $arr虽然能用,但易读性差) -
[$a, , $c] = $arr明确跳过第二个元素,更直观 -
list无法嵌套解构(如二维数组),而[[$a], $b] = $arr可以 -
list不支持键名匹配(必须按索引顺序),而['name' => $n] = $arr是关联数组解构(需 PHP 7.1+)
什么时候该用 list?其实基本不用了
除非你维护一个 PHP 5.6–7.2 的遗留项目,且团队约定沿用旧风格;否则所有新代码应直接用短数组解构。它更安全、更灵活、IDE 支持更好,且和 JavaScript/Python 的解构习惯一致。
立即学习“PHP免费学习笔记(深入)”;
- 兼容老版本?用
isset($arr[0]) ? $arr[0] : null显式判断,比依赖list静默赋null更可靠 - 要从数据库查询结果取字段?
[$id, $name] = $row比list($id, $name) = $row少敲两个字符,也少一个概念负担 - 函数返回多值?优先改用
return ['id' => 1, 'name' => 'foo']+ 关联解构,语义比位置依赖强得多
真正麻烦的不是语法怎么写,而是当别人在 list 里混用引用(&$var)或表达式(list($a, $b++) = $arr)时,PHP 解析顺序和副作用极难预测 —— 这类写法现在连 PHPStan 都会标红警告。



















