
PHP 8.0 起,已废弃多年的 each() 函数被正式移除,导致依赖它的旧代码(如 while (list($k, $v) = each($arr)))在升级后直接报错;本文详解安全、等效的现代替代写法,并提供兼容性建议与实践注意事项。
php 8.0 起,已废弃多年的 `each()` 函数被正式移除,导致依赖它的旧代码(如 while (list($k, $v) = each($arr)))在升级后直接报错;本文详解安全、等效的现代替代写法,并提供兼容性建议与实践注意事项。
each() 函数曾用于遍历数组并同时返回当前键值对,常与 list() 配合实现手动迭代,例如:
// ❌ PHP 7.2+ 已弃用,PHP 8.0+ 完全移除
while (list($key, $val) = @each($catcho)) {
$whiskers[] = $val;
}该写法不仅可读性差、易出错(@ 抑制错误掩盖逻辑问题),且在 PHP 8+ 中会触发 Fatal error: Uncaught Error: Call to undefined function each(),导致脚本中断。
✅ 推荐使用 foreach 替代——它语义清晰、性能更优、完全兼容所有现代 PHP 版本:
// ✅ 推荐:简洁、安全、高效
foreach ($catcho as $val) {
$whiskers[] = $val;
}若需同时访问键和值(如原 each() 中的 $key),只需扩展语法:
立即学习“PHP免费学习笔记(深入)”;
// ✅ 获取键与值(等价于原 each() 行为)
foreach ($catcho as $key => $val) {
$whiskers[] = $val;
// 可选:echo "Key: $key, Value: $val";
}⚠️ 注意事项:
- 不要用 @ 抑制错误:@each() 中的错误抑制器不仅降低调试效率,还可能掩盖数组为空、非数组类型等根本问题。应先校验输入:if (is_array($catcho) && !empty($catcho)) { ... };
- 避免重复初始化:确保 $whiskers = []; 在循环前已声明,防止意外追加到已有数据;
- 兼容旧版本过渡(不推荐长期使用):如需临时支持 PHP
// ⚠️ 仅作过渡参考,勿用于新项目
if (!function_exists('each')) {
function each(&$array) {
$key = key($array);
if ($key === null || !isset($array[$key])) return false;
$result = [$key, $array[$key], 'key' => $key, 'value' => $array[$key]];
next($array);
return $result;
}
}? 总结:each() 的移除是 PHP 持续精简核心、推动现代化编码的重要一步。foreach 不仅功能全覆盖,还具备更好的可读性、可维护性与执行效率。迁移时建议同步检查是否遗漏其他已废弃特性(如 mysql_* 函数、create_function() 等),并利用 php -l 和静态分析工具(如 PHPStan)辅助验证。











