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

升级PHP 8.0后出现Cannot access offset of type string错误求助

PHP 8.0升级后触发TypeError: Cannot access offset of type string on string

问题情况

把网站PHP版本从7.4升到8.0后,一直报这个致命错误:

PHP Fatal error: Uncaught TypeError: Cannot access offset of type string on string in...

错误出在这段代码上:

<a class="menu-item__second-level" href="<?php echo $second_level_link['url']; ?>"><?php echo $second_level_link['title']; ?></a>

已经确定是$second_level_link的问题,但另外两个同类的链接数组$top_level_link和$third_level_link没出问题,完整代码如下(加粗部分是second_level_link的生成逻辑):

$primary_menu_top_level = get_field('primary_menu_top_level', 'option');
if ($primary_menu_top_level) :
?>
<div class="menu-primary-menu-container">
    <ul id="primary-menu" class="menu">
        <?php
        foreach($primary_menu_top_level as $item) :
            $top_level_link = $item['link'];
            $image = $item['image'];
            $description = $item['description'];
            $second_level = $item['second_level'];
            ?>
            <li class="menu-item js-toggle-wrap">
                <a class="menu-item__top-level" href="<?php echo $top_level_link['url']; ?>">
                    <?php echo $top_level_link['title']; ?>
                    <?php 
                    if ($second_level) :
                    ?>
                        <span class="icon icon--dropdown js-toggle"></span>
                    <?php
                    endif;
                    ?>
                </a>
                <?php
                if ($second_level) :
                ?>
                <ul class="sub-menu js-togglee">
                    <div class="container sub-menu__container">
                        <div class="sub-menu__image">
                            <?php echo wp_get_attachment_image($image, 'small_sqr'); ?>
                        </div>
                        <div class="sub-menu__text">
                            <div class="sub-menu__desc">
                                <?php echo $description; ?>
                            </div>
                            <a class="button" href="<?php echo $top_level_link['url']; ?>"><?php echo $top_level_link['title']; ?></a>
                        </div>
                        <div class="sub-menu__links">
                            <ul>
                            <?php
                            foreach($second_level as $sub_item) :
                                $second_level_link = $sub_item['link'];
                                $third_level = $sub_item['third_level'];
                            ?>
                            <li>
                                <a class="menu-item__second-level" href="<?php echo $second_level_link['url']; ?>"><?php echo $second_level_link['title']; ?></a>
                                <?php
                                if ($third_level) :
                                ?>
                                <ul>
                                    <?php
                                    foreach($third_level as $third_item) :
                                        $third_level_link = $third_item['link'];
                                    ?>
                                    <li><a class="menu-item__third-level" href="<?php echo $third_level_link['url']; ?>"><?php echo $third_level_link['title']; ?></a></li>
                                    <?php
                                    endforeach;
                                    ?>
                                </ul>
                                <?php
                                endif;
                                ?>
                            </li>
                            <?php
                            endforeach;
                            ?>
                            </ul>
                        </div>
                    </div>
                    <?php include( locate_template( 'template-parts/svg/wustl-shield.svg', false, false ) ); ?>
                </ul>
                <?php
                endif;
                ?>
            </li>
            <?php
        endforeach;
        ?>
    </ul>
</div>
<?php
endif;
?>

问题原因及修复

PHP 8.0开始严格禁止对字符串用数组偏移的方式访问(比如$str['key']),而7.4会悄悄忽略这个错误返回null。你的问题就是$second_level_link不是预期的数组,变成了字符串。

解决步骤

  1. 检查ACF字段配置:对比top_level_link和third_level_link对应的ACF字段,看看second_level下面的link子字段是不是被设成了文本类型,而不是ACF自带的“链接”字段(后者会返回包含url和title的数组)。
  2. 检查后台数据:进WordPress后台,看看顶级菜单下的二级菜单条目里,link字段是不是正确填了ACF链接格式,而不是直接输了个字符串URL。
  3. 代码里加类型校验:在循环里判断$second_level_link是不是数组,避免非数组触发错误,修改后的代码片段:
<?php
foreach($second_level as $sub_item) :
    $second_level_link = $sub_item['link'];
    // 先判断是不是数组,不是就跳过
    if (!is_array($second_level_link)) {
        continue;
    }
    $third_level = $sub_item['third_level'];
?>
<li>
    <a class="menu-item__second-level" href="<?php echo esc_url($second_level_link['url']); ?>"><?php echo esc_html($second_level_link['title']); ?></a>
    <!-- 后面的代码不变 -->
</li>

额外提醒

  • 输出到HTML的内容最好用esc_url()和esc_html()转义,能提升网站安全性。
  • 开发环境可以开PHP严格模式,提前发现这类类型错误。

内容的提问来源于stack exchange,提问作者alaska

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:40:33