老项目迁到 PHP 8 后,首页直接报致命错误,提示 each 函数不存在,涉及的循环有好几处。日志里能对上时间点,这种反而好排。

each 在 PHP 8 中已被移除,配套的 list 加 each 写法必须改成 foreach。这一点先确认清楚,后面就不用反复试。

// 旧写法
// while (list($k, $v) = each($arr)) {}
foreach ($arr as $k => $v) {
    echo $k, '=', $v;
}

「PHP8 each 移除」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

处理上按这个顺序:全局搜索 each 调用点;改成 foreach 遍历并保留键值变量;回归测试依赖该循环的列表页。

结果对不对很好判断,替换后页面能正常渲染,列表条数与升级前一致,无新的警告。

作者 9823189