PHP 7.3 的 is_countable() 可安全判断 count() 兼容类型,低版本需手动兼容或引入 symfony/polyfill-php73;仅用 is_array() 会漏掉 Countable 对象,导致逻辑错误。

PHP 7.3 引入的 is_countable() 是解决 count() 警告最直接的方式,但若运行环境仍是 PHP 7.2 或更低版本,该函数会报 Fatal error: Uncaught Error: Call to undefined function is_countable()。无需升级 PHP,用几行兼容代码就能安全落地。
为什么不能只靠 is_array()?
因为 is_array() 只识别数组,漏掉所有实现了 Countable 接口的对象(比如 Laravel 的 Collection、Symfony 的 ArrayCollection、SimpleXML 对象等)。这些对象合法支持 count(),但被 is_array() 判为 false,导致逻辑跳过或误判。
- ✅ 正确覆盖:数组、Countable 实例、SimpleXMLElement、ResourceBundle
- ❌ 仅 is_array():跳过所有 Countable 对象,破坏业务逻辑
手动实现 is_countable() 兼容函数
在项目启动文件(如 functions.php 或入口 bootstrap 文件)中加入以下定义即可:
if (!function_exists('is_countable')) {
function is_countable($var) {
return is_array($var)
|| $var instanceof Countable
|| $var instanceof SimpleXMLElement
|| $var instanceof ResourceBundle;
}
}
这个实现与 PHP 7.3 原生行为一致,返回 true 仅当变量可被 count() 安全调用,其余情况(null、string、int、false 等)均返回 false,无副作用。
立即学习“PHP免费学习笔记(深入)”;
更省心的方案:用 Symfony Polyfill
如果你的项目已使用 Composer,推荐引入官方维护的兼容层:
composer require symfony/polyfill-php73
安装后只需在入口处加载自动加载器(通常 Composer 已处理),is_countable() 等函数即可开箱即用。它还同步提供了 array_key_first()、array_key_last()、hrtime() 等其他 PHP 7.3 功能,长期维护、零配置、无运行时开销。
实际使用时的关键习惯
别再写 count($data) 前不加判断 —— 即使加了 is_array() 也不够健壮。统一改用:
$len = is_countable($data) ? count($data) : 0;- 避免用
@count($data)屏蔽警告:错误被压制,后续逻辑可能因$len为null或意外值而崩溃 - WordPress 用户注意:4.9.6+ 已内置该函数兼容层,但前提是主题/插件没提前定义同名函数造成冲突



















