PHP7版本升级后报count()参数不符合Countable要求的修复咨询
问题原因定位
- 首先排除括号闭合错误的可能:如果存在括号不匹配的语法问题,PHP会直接抛出解析级别的致命错误,整个文件都无法被加载执行,不可能走到元盒获取方法的运行阶段再触发
count()的警告。 - 报错的核心触发条件是PHP7对
count()函数的校验规则收紧:PHP5.x时代调用count()传入非数组、非Countable实例的标量值(字符串、null、数字等)时,函数会默认返回1且不抛出任何警告;从PHP7.0开始,只要传入参数不满足可计数要求,就会触发题目中提到的Warning提示。 - 代码本身的逻辑隐患:代码判断顺序写反了。逻辑与
&&是从左到右短路执行的,原代码先执行count($meta_boxes),后面才判断$meta_boxes是不是数组。当RecursiveArray::searchRecursive()返回单条标量值(而非数组结构)时,count()在还没走到类型判断的环节就已经触发了PHP7的校验警告,后续的is_array判断根本不会执行到。
修复方案
只需要调整判断逻辑的执行顺序,把类型校验放到count()调用之前,确保count()拿到的参数一定是可计数类型即可,不需要改动其他业务逻辑:
- 基础兼容修复(适配所有PHP7版本)
将原if判断的顺序调整为先判断数组类型,再执行count:// 修复前(顺序错误触发警告) if ( \count( $meta_boxes ) == 1 && \is_array( $meta_boxes ) && $remove_first ) { return $meta_boxes[ 0 ]; } // 修复后(顺序正确消除警告) if ( \is_array( $meta_boxes ) && \count( $meta_boxes ) == 1 && $remove_first ) { return $meta_boxes[ 0 ]; } - 严谨兼容(适配PHP7.3及以上版本)
可以使用PHP7.3内置的is_countable()方法做更通用的类型判断,覆盖所有支持count的类型(数组、实现Countable接口的对象):if ( \is_countable( $meta_boxes ) && \count( $meta_boxes ) == 1 && $remove_first ) { return $meta_boxes[ 0 ]; }
调整后代码的原有逻辑完全不变,只是利用逻辑短路的特性避免给count()传入非法参数,就能彻底消除对应的Warning提示。
内容的提问来源于stack exchange,提问作者Noob2013
相关产品推荐
相关产品推荐

