php 8.4 弃用 list()/[] 中的引用解构、array_key_exists() 检查对象属性、extract() 的 extr_refs 标志,以及松散比较空数组为 false 的用法,均标记为 deprecated 并将在 php 9.0 彻底移除。

PHP 8.4 开始正式弃用部分数组相关语法和函数行为,主要影响旧代码的兼容性和未来升级路径。这些变更并非突然移除,而是标记为 deprecated,会在后续版本(如 PHP 9.0)中彻底删除。
弃用的数组解构语法:list() 和 [] 解构中的引用赋值
PHP 8.4 起,list() 和短数组解构语法 [] 中对变量使用引用(&$var)的方式被弃用。这种写法过去允许在解构时直接绑定引用,但易引发混淆且与现代 PHP 的引用语义不一致。
- 被弃用写法:
list(&$a, &$b) = $arr;或[&$x, &$y] = $arr; - 替代方案:先解构,再手动引用赋值,例如:
[$a, $b] = $arr; $a = &$arr[0]; $b = &$arr[1]; - 注意:仅引用解构被弃用,普通解构(
list($a, $b)或[$x, $y])完全正常。
弃用 array_key_exists() 检查对象属性
此前若传入对象给 array_key_exists(),PHP 会静默调用对象的 __isset() 方法进行判断。该行为未明确文档化,且语义模糊(“检查数组键”却用于对象),PHP 8.4 起弃用此用法。
集企业自助建站、网络营销、商品推广于一体的系统 功能说明: 1、系统采用Microsoft SQL Server大型数据库支持,查询数据库用的全是存储过程,速度和性能极好。开发环境是vs.net,采用4层结构,具有很好的可维护性和可扩冲性。 2、用户注册和登陆 未注册用户只具备浏览商品、新闻和留言功能;要采购商品,需接受服务协议并填写相关注册信息成为正式用户后方可进行,以尽可能减少和避免无效
- 被弃用写法:
array_key_exists('prop', $obj);(其中$obj是对象) - 替代方案:显式调用
isset($obj->prop)或$obj->__isset('prop')(如果需自定义逻辑) - 对数组仍完全有效:
array_key_exists('key', $arr)不受影响。
弃用 extract() 的 EXTR_REFS 标志
extract() 函数的 EXTR_REFS 标志用于将数组变量以引用方式导入当前作用域。该特性极易导致难以追踪的变量副作用,PHP 8.4 正式弃用。
立即学习“PHP免费学习笔记(深入)”;
- 被弃用写法:
extract($arr, EXTR_REFS); - 替代方案:避免使用引用导入;如需共享数据,改用对象属性、引用传递参数或返回引用数组等更可控方式。
- 其他标志(如
EXTR_OVERWRITE、EXTR_SKIP)不受影响。
弃用隐式转换空数组为 false 的松散比较
虽然不是语法弃用,但 PHP 8.4 加强了对 empty([]) 和 [] == false 等表达式的类型敏感提示。严格模式下,空数组与布尔值的松散比较不再推荐,尤其在条件判断中混用可能触发弃用警告(取决于 SAPI 和 error_reporting 配置)。
- 建议统一使用
empty($arr)判断数组是否为空(语义清晰,无弃用风险) - 避免
$arr == false或!$arr判断数组——这实际检测的是“是否为 falsy”,空数组只是其中之一,逻辑不精确。










