
PHP 8.0 起,已废弃多年的 each() 函数被彻底移除,导致依赖它的旧代码(如 while (list($k, $v) = each($arr)))运行报错;本文详解安全、兼容的替代写法,并提供迁移注意事项与最佳实践。
php 8.0 起,已废弃多年的 `each()` 函数被彻底移除,导致依赖它的旧代码(如 `while (list($k, $v) = each($arr))`)运行报错;本文详解安全、兼容的替代写法,并提供迁移注意事项与最佳实践。
在 PHP 8.0 及更高版本中,each() 函数已被完全移除(而非仅弃用),这是 PHP 核心清理长期废弃功能的重要一步。该函数原本用于遍历数组并返回当前键值对,常与 list() 配合实现手动迭代,例如:
// ❌ PHP 8.0+ 已失效(Fatal error: Uncaught Error: Call to undefined function each())
while (list($key, $val) = @each($catcho)) {
$whiskers[] = "$val";
}上述代码在 PHP 7.2+ 已触发 E_DEPRECATED 警告,而升级至 PHP 8.0 后将直接抛出 Fatal error,导致脚本中断。
✅ 推荐替代方案:使用 foreach 循环
foreach 不仅语义清晰、性能更优,且完全兼容所有现代 PHP 版本(5.0+ 至 8.x),是官方明确推荐的标准迭代方式:
// ✅ 简洁、安全、向后兼容的写法
foreach ($catcho as $val) {
$whiskers[] = $val;
}若需同时获取键与值(如原 each() 中的 $key),可扩展为:
立即学习“PHP免费学习笔记(深入)”;
// ✅ 获取键和值(等价于原 each() 行为)
foreach ($catcho as $key => $val) {
$whiskers[] = $val; // 或根据业务需要使用 $key
}⚠️ 注意事项与迁移建议:
- 避免 @ 抑制错误:原代码中的 @each(...) 属不良实践,掩盖了关键错误信号;迁移后应彻底移除 @,依靠 foreach 的健壮性保障逻辑安全。
- 无需手动重置内部指针:each() 依赖数组内部指针,多次调用需 reset();而 foreach 每次均从头遍历,天然无状态,无需额外管理。
-
类型安全增强:若 $catcho 可能为 null 或非数组,建议前置校验:
if (is_array($catcho) && !empty($catcho)) { foreach ($catcho as $val) { $whiskers[] = (string)$val; // 显式类型转换更稳妥 } } -
批量处理优化:若仅需提取值并构建新数组,可进一步简化为:
$whiskers = array_values($catcho); // 直接获取所有值(索引重排为数字键) // 或保留原始键:$whiskers = $catcho;
? 总结:each() 的移除标志着 PHP 进一步拥抱清晰、高效、可维护的编程范式。将 while + each 替换为 foreach 不仅解决兼容性问题,更是代码现代化的重要一步。建议在升级 PHP 版本前,通过静态分析工具(如 PHPStan)或 php -l 批量扫描项目中残留的 each() 调用,确保平滑过渡。











