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

MyBB 1.8.15在PHP7.2.4中count()函数报错求助(行906)

解决MyBB 1.8.15在PHP 7.2.4下的count()警告问题

问题分析

你碰到的这个Warning [2] count(): Parameter must be an array or an object that implements Countable错误,本质是PHP 7.2及后续版本收紧了count()函数的参数要求——它只能接收数组或者实现Countable接口的对象。而你的代码里,$postsdone变量在第一次执行到第906行时,大概率还没被初始化为数组(比如循环还没开始执行、没有匹配的帖子数据),导致传入了非可数类型(比如未定义的变量),触发了警告。

看你贴的代码片段,$postsdone是在循环内部通过$postsdone[$post['pid']] = 1;赋值的,但如果循环没走到这一步,变量就处于未初始化状态,直接用count()自然会报错。

解决方法

这里有两种简单可靠的修复方式,选一种就行:

方法1:提前初始化$postsdone为数组

在查询和循环代码的最前面,给$postsdone赋一个空数组的初始值,从根源上保证它始终是可数类型:

// 提前初始化空数组,确保count()能拿到合法参数
$postsdone = [];

// 以下是你原来的查询与循环代码
$query = $db->query(" SELECT p.username, p.uid, p.pid, p.replyto, p.subject, p.dateline FROM ".TABLE_PREFIX."posts p WHERE p.tid='$tid' $visible ORDER BY p.dateline ");
while($post = $db->fetch_array($query)) {
    if(!$postsdone[$post['pid']]) {
        if($post['pid'] == $mybb->input['pid'] || ($isfirst && !$mybb->input['pid'])) {
            $postcounter = count($postsdone);
            $isfirst = 0;
        }
        $tree[$post['replyto']][$post['pid']] = $post;
        $postsdone[$post['pid']] = 1;
    }
}

方法2:给count()添加类型检查

如果不想修改变量初始化逻辑,可以在调用count()时先做防御性检查,确保参数合法:

  • 如果你用的是PHP 7.3及以上版本,可以直接用is_countable():
// 替换原有的$postcounter = count($postsdone);
$postcounter = is_countable($postsdone) ? count($postsdone) : 0;
  • 如果还停留在PHP 7.2版本,用is_array()判断即可:
$postcounter = is_array($postsdone) ? count($postsdone) : 0;

为什么这能解决问题?

  • 方法1遵循了变量初始化的最佳实践,不管循环是否执行,$postsdone都是数组类型,count()永远能拿到合法参数。
  • 方法2是做了兼容性兜底,当$postsdone不是可数类型时,直接返回0(逻辑上也合理,没有处理过帖子的话计数就是0),避免触发警告。

两种方法都能快速解决这个PHP 7.2的兼容性问题,更推荐方法1,代码逻辑更清晰。

内容的提问来源于stack exchange,提问作者wp-design

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:42:41