each()函数在PHP 8.0中被彻底移除,必须将while(list($key,$value)=each($arr))替换为foreach($arr as $key=>$value),其他误用场景应改用reset()/key()/array_keys()等替代方案。

each() 函数在 PHP 8.0 中已被彻底移除,不是警告、不是弃用,而是直接报 Fatal error: Uncaught Error: Call to undefined function each()。你升级后遇到这个错误,说明代码里还保留着 PHP 4/5 风格的数组遍历写法,必须手动替换。
直接替换为 foreach(最常用、最安全)
each() 原本用于配合 while 遍历数组,返回当前键值对并推进内部指针,典型写法:
while (list($key, $value) = each($arr)) {
echo "$key => $value\n";
}✅ 正确替换方式是改用 foreach:
foreach ($arr as $key => $value) {
echo "$key => $value\n";
}不需要手动维护指针,语义清晰,性能更好,且完全兼容 PHP 7.4 到 8.4+。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
其他常见误用场景及改法
-
只取第一个元素?
错误写法:$first = each($arr);
正确写法:$first = reset($arr); // 获取值 $firstKey = key($arr); // 获取键 // 或更直观: $keys = array_keys($arr); $firstKey = $keys[0] ?? null; $firstValue = $arr[$firstKey] ?? null;
-
配合
list()解构赋值?
错误写法:list($a, $b) = each($arr);
正确写法(取前两个键值):$pairs = array_slice($arr, 0, 2, true); $keys = array_keys($pairs); $values = array_values($pairs); $a = $keys[0] ?? null; $b = $values[0] ?? null;
但这类需求极少,建议重审业务逻辑——大概率是误用
each()。 旧模板引擎或路由匹配中动态生成回调?
比如create_function()+each()组合,这种已双重淘汰(create_function也在 8.0 移除),必须重构为匿名函数 +foreach。
不要这样做
- ❌ 不要用
reset()+next()+key()+current()手动模拟each()行为——复杂、易错、无必要 - ❌ 不要试图
function each($arr) { ... }自定义兼容函数——PHP 8.0 下函数名被保留,会报语法错误 - ❌ 不要依赖
@each()抑制错误——根本调用不到,直接致命
基本上就这些。只要把所有 each( 全局搜出来,逐个换成 foreach 结构,这个报错就清零了。


















