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
相关产品推荐
相关产品推荐

