each() 在 PHP 8.0 彻底消失,因其返回混搭索引数组导致类型不安全、强行篡改全局数组指针引发不可预测行为,且所有功能均可由更安全清晰的 foreach 等替代。

each() 为什么在 PHP 8.0 彻底消失
因为 each() 的设计与现代 PHP 的数组模型、迭代机制和内存安全原则全面冲突,不是“过时”,而是“不可修复”。它被移除不是为了清理旧代码,而是为了堵住底层隐患。
它返回的数组结构本身就是个陷阱
each() 返回一个四元素混合数组:[0 => $key, 1 => $value, 'key' => $key, 'value' => $value]。这种既用数字索引又用字符串索引的混搭,导致:
- 无法用严格类型(如
array{key: string, value: mixed})准确描述返回值 - 读取
$result['key']和$result[0]看似等价,但实际语义不同:前者是“键名”,后者是“第一个元素”,一旦数组被修改,两者可能脱节 - 在 strict_types=1 下极易触发类型警告或 fatal error
它强行绑定并篡改数组内部指针
PHP 数组有且仅有一个内部指针(由 current()/next() 等函数共享),而 each() 每次调用都隐式执行 next()。问题在于:
- 多个
each()调用嵌套或交叉时,指针状态完全不可预测 - 与
foreach同时使用会互相干扰——foreach不动指针,each()却猛推一把,结果下一次foreach可能从中间开始 - 对引用数组(
&$arr)行为不稳定,PHP 7.4+ 开始出现随机 segfault
它没有替代价值,只有历史包袱
所有 each() 能干的事,都有更清晰、更安全、更可静态分析的写法:
- 要逐对读取键值?直接用
foreach ($arr as $k => $v)—— 语义明确,无副作用,支持键类型推导 - 要手动控制指针前进?用
key($arr)+current($arr)+next($arr)组合,至少每步意图清晰 - 要兼容旧逻辑封装?写个
myEach()函数也得显式传参、不污染原数组指针,而不是依赖全局状态
真正难处理的从来不是“怎么替代”,而是那些把 each() 当成唯一遍历手段、还把它嵌在递归或闭包里的老项目——它们暴露的不是函数淘汰问题,是架构层面对 PHP 迭代模型的根本误解。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











