升级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不是预期的数组,变成了字符串。
解决步骤
- 检查ACF字段配置:对比
top_level_link和third_level_link对应的ACF字段,看看second_level下面的link子字段是不是被设成了文本类型,而不是ACF自带的“链接”字段(后者会返回包含url和title的数组)。 - 检查后台数据:进WordPress后台,看看顶级菜单下的二级菜单条目里,
link字段是不是正确填了ACF链接格式,而不是直接输了个字符串URL。 - 代码里加类型校验:在循环里判断
$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
相关产品推荐
相关产品推荐

