XAMPP 8(PHP 8)下执行count($_POST['adm_num'])抛出TypeError报错
PHP 8 环境下 count() 函数触发 TypeError 报错的原因与解决方法
触发原因
这是PHP版本迭代带来的内置函数行为变更,并非原有业务逻辑失效:
- PHP 7.2 及更早版本中,
count()函数接收到非数组、非Countable类型的传入值(如null)时,仅抛出E_WARNING级别的通知,不会中断程序执行。旧环境下即使$_POST['adm_num']字段不存在,代码也能正常走完流程,仅会在后台日志留存警告。 - PHP 8 对内置函数的参数类型校验做了强制升级:
count()第一个参数严格要求传入值为array或实现了Countable接口的对象类型,传入null、字符串、数字等非合规值时,会直接抛出致命TypeError,终止程序运行。 - 本次报错的直接诱因:当前请求未提交
adm_num字段,导致$_POST['adm_num']的实际取值为null,不符合count()的参数要求,对应报错信息为Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, null given。
解决方法
- 简洁兜底写法
借助空合并运算符设置默认值,适配PHP 8的参数校验规则:// 字段不存在、取值为null时,默认传入空数组完成统计 $adm_num = $_POST['adm_num'] ?? []; $size = count($adm_num); - 严谨防御写法
针对前端可能误传非数组类型adm_num的场景(如单个字符串、数字值),增加前置类型判断,从根源避免类型不匹配问题:$size = 0; // 仅当字段取值为数组时,才执行count统计 if (is_array($_POST['adm_num'] ?? null)) { $size = count($_POST['adm_num']); } - 注意事项
不要通过调低PHP错误显示级别、屏蔽TypeError的方式临时消错。这种操作仅会把错误隐藏在后台日志中,并未解决表单字段缺失的逻辑漏洞,长期运行可能引发后续业务逻辑异常。
内容的提问来源于stack exchange,提问作者Asgwani
相关产品推荐
相关产品推荐

