如何修改dwoo.php代码适配PHP 8.0以解决未定义数组键警告
PHP 8.0适配:Dwoo模板引擎each()函数替换方案
问题场景
主机强制从PHP 7.4升级到8.0后,基于Dwoo模板引擎开发的电商网站出现PHP Warning: Undefined array key警告。尝试替换代码中的each()函数后,依然报错且部分功能异常,需要修改代码适配PHP 8.0。
原代码片段
while (list($k, $sep) = each($m[1])) { if ($sep === '.' || $sep === '[' || $sep === '') { if ((is_array($cur) || $cur instanceof ArrayAccess) && isset($cur[$m[2][$k]])) { $cur = $cur[$m[2][$k]]; } else { return null; } } elseif ($sep === '->') { if (is_object($cur)) { $cur = $cur->$m[2][$k]; } else { return null; } } else { return null; } } return $cur;
错误的修改尝试
直接将each($m[1])替换为$m[1],写成:
while (list($k, $sep) = $m[1]) {
这种写法错误,因为每次循环都会把整个数组$m[1]赋值给list($k, $sep),只会取数组的第一个元素(键为0,值为第一个元素值),且循环会无限执行,导致报错和功能异常。
正确的适配修改方案
each()函数在PHP 7.2已被废弃,PHP 8.0彻底移除,需改用foreach遍历数组的键值对,这是PHP官方推荐的替代方案。修改后的代码如下:
foreach ($m[1] as $k => $sep) { if ($sep === '.' || $sep === '[' || $sep === '') { if ((is_array($cur) || $cur instanceof ArrayAccess) && isset($cur[$m[2][$k]])) { $cur = $cur[$m[2][$k]]; } else { return null; } } elseif ($sep === '->') { if (is_object($cur)) { $cur = $cur->$m[2][$k]; } else { return null; } } else { return null; } } return $cur;
修改说明
- 把
while (list($k, $sep) = each($m[1]))替换为foreach ($m[1] as $k => $sep),直接遍历$m[1]的每个键值对,与原each()的行为完全一致。 - 保留原循环内的所有逻辑,无需额外修改,即可解决
Undefined array key警告,同时保证功能正常。
内容的提问来源于stack exchange,提问作者Heinrich
相关产品推荐
相关产品推荐

