PHP 7.2+ 中 count() 报 Warning 的本质是类型校验变严:传入 null、string、int 或未定义变量时不再静默转为 0,而是直接警告;需用 is_array() 等预判类型或检查数据来源有效性。

phpEnv 中 count() 报错:参数不是数组
这个警告本质是 PHP 严格模式下对 count() 的类型校验变强了——传入 null、string、int 或未定义变量时直接报 Warning,而旧版 PHP(如 7.2 之前)会静默转为 0。phpEnv 默认启用较新 PHP 版本(如 8.1/8.2),且 error_reporting 常设为 E_ALL,所以这类问题立刻暴露。
检查并修正 count() 的输入来源
绝大多数情况,出错代码形如 count($data),但 $data 实际是 null(比如数据库查询失败、API 返回空、json_decode() 失败未加判断)。不能靠 suppress(@count())掩盖,得修复源头逻辑:
- 用
is_array($data) && count($data) > 0替代直接count($data) - 若
$data来自json_decode($json, true),务必检查$json是否为空或解码失败:if (json_last_error() !== JSON_ERROR_NONE) { /* 处理错误 */ } - 数据库查询结果(如 PDO::fetch())可能返回
false,别直接count($row);先if ($row !== false) - 函数返回值未明确文档时,用
var_dump($data)看清真实类型,再决定是否(array)$data强转(仅限你确定可安全转换的场景)
phpEnv 环境中临时绕过(仅调试用)
不推荐长期使用,但排查阶段可快速验证是否为纯类型问题:
- 在出错脚本顶部加:
error_reporting(E_ALL & ~E_WARNING);—— 仅屏蔽 Warning,不影响其他错误 - 或修改 phpEnv 对应 PHP 版本的
php.ini(路径类似D:\phpEnv\php\php-8.2.12\php.ini),将error_reporting = E_ALL改为error_reporting = E_ALL & ~E_WARNING,然后重启 Apache/Nginx - 注意:
count(null)在 PHP 8.0+ 已是 Deprecated,8.1+ 升级为 Warning,未来版本可能变 Error;临时压制只是帮你定位,不是解决方案
为什么 array_key_exists() 或 isset() 不能替代 count()?
这是常见误解。如果你真正想判断“数组是否有元素”,count($arr) > 0 是语义最直接的;而 isset($arr) 只检查变量是否已声明且非 null,array_key_exists(0, $arr) 只查键存在性——两者都不能等价于“非空数组”。尤其当 $arr = [](空数组)时,isset($arr) 为 true,但 count($arr) 是 0。别为了省一个函数调用去混淆语义。
立即学习“PHP免费学习笔记(深入)”;



















