
PHP 8.0 起正式移除了废弃多年的 each() 函数,原依赖该函数的 while (list($key, $val) = each($array)) 循环需改用 foreach 替代,以确保代码兼容性与可维护性。
php 8.0 起正式移除了废弃多年的 `each()` 函数,原依赖该函数的 `while (list($key, $val) = each($array))` 循环需改用 `foreach` 替代,以确保代码兼容性与可维护性。
在 PHP 8.0 及更高版本中,each() 函数已被完全移除(而非仅弃用),这意味着任何使用 each() 的代码在升级至 PHP 8+ 后将直接触发 Fatal Error: Uncaught Error: Call to undefined function each(),导致脚本中断。你遇到的“原本正常工作的代码突然失效”,极大概率正是服务器 PHP 版本从 7.x 升级到了 8.0+ 所致。
你提供的原始代码:
while (list($key, $val) = @each($catcho)) {
$whiskers[] = "$val";
}其逻辑是遍历数组 $catcho,提取每个元素的值($val)并追加到 $whiskers 数组中。这种写法在 PHP 7.2 起已被标记为 E_DEPRECATED,并在 PHP 8.0 彻底删除。
✅ 推荐替代方案:使用 foreach(简洁、安全、语义清晰)
立即学习“PHP免费学习笔记(深入)”;
foreach ($catcho as $val) {
$whiskers[] = $val; // 或更简洁地:$whiskers[] = $val;
}若还需同时获取键名(例如 $key),可写作:
foreach ($catcho as $key => $val) {
$whiskers[] = $val;
// 可选:echo "Key: $key, Value: $val\n";
}⚠️ 注意事项与最佳实践:
- 不要使用 @ 抑制错误:原代码中的 @each(...) 会掩盖问题,且在 PHP 8+ 下无效。应主动修复逻辑,而非隐藏错误。
- 避免手动重置内部指针:each() 依赖数组内部游标,而 foreach 始终从头开始遍历,行为更可预测;无需调用 reset()。
-
类型安全提示:若 $catcho 可能为 null 或非数组,建议增加类型检查:
if (is_array($catcho)) { foreach ($catcho as $val) { $whiskers[] = $val; } } - 性能无差异:foreach 在 PHP 中针对数组做了深度优化,性能优于旧式 each() + list() 组合,且内存更友好。
? 总结:each() 的移除是 PHP 持续精简核心、提升一致性的关键一步。将所有 each() 循环统一重构为 foreach,不仅能解决兼容性问题,还能使代码更易读、更健壮。迁移成本极低,建议在项目升级前通过静态分析工具(如 PHPStan)或 grep -r "each(" . 快速定位全部残留调用并批量替换。











