You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:12:36