php 8.0 已彻底移除 each() 函数,调用将触发 fatal error;因其依赖不稳定的数组内部指针,与现代 php 的 foreach 机制冲突,应统一替换为 foreach 或 key()/current() 组合。

PHP each() 已被废弃且移除
each() 在 PHP 7.2 中被标记为 deprecated,在 PHP 8.0 中**彻底移除**。调用它会直接触发 Fatal error: Uncaught Error: Call to undefined function each()。这不是“不建议用”,而是根本不能用——函数已不存在。
为什么它被干掉?核心是设计缺陷
each() 依赖并移动数组内部指针,而 PHP 数组的指针行为本身就不稳定:
- 多处调用
current()/next()等函数后,指针位置难以预测 - 在
foreach循环中混用each()会导致指针错乱,遍历跳项或重复 - 对引用数组、动态修改(
unset()/array_push())后的数组,each()行为不可靠
它本质上是为早期 PHP(4.x)设计的“手动迭代器”,与现代 PHP 的哈希表结构和 foreach 的游标机制不兼容。
替代方案:用 foreach 或 key()/current() 组合
绝大多数原 each() 使用场景,应直接改写为 foreach:
<pre class="brush:php;toolbar:false;">// ❌ 已失效
while (list($key, $value) = each($arr)) {
echo "$key => $value";
}
// ✅ 替代写法(推荐)
foreach ($arr as $key => $value) {
echo "$key => $value";
}
若必须手动控制指针(极少见),可用 key()
current() + next(),但需自行管理边界和重置逻辑,风险高、可读差,仅限特殊底层封装。
容易忽略的兼容性陷阱
升级到 PHP 8+ 后,以下代码会直接崩溃,且 IDE/静态分析工具不一定能识别:
- 第三方库中残留的
each()调用(尤其老版 Smarty、Zend Framework 1 插件) - 用
@each()抑制错误——@对 Fatal Error 无效 - 通过
function_exists('each')做降级兼容——PHP 8 下永远返回false,逻辑中断
真正安全的做法不是绕过,而是删掉所有 each(),用 foreach 重写。它的语义更清晰,性能更好,且与数组键类型(字符串/数字/非连续)完全无关。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











