php中null转int默认结果为0,这是类型转换规则所致,并非安全兜底;(int)null和intval(null)均返回0,但filter_var(null, filter_validate_int)返回false,需依业务语义谨慎选择。

PHP中null转int的默认行为是什么
直接用(int)或intval()转换null,结果确实是0——但这不是“安全的零值兜底”,而是类型转换规则下的副作用。PHP把null视作“空值”,在整型上下文中统一映射为0,和false、空字符串''一样。
常见错误现象:isset($data['score']) ? (int)$data['score'] : 0看起来严谨,但如果$data['score']是null,isset()返回false,你手动给了0;但其实不加isset,(int) null也是0。这里多了一层判断,反而掩盖了真实数据状态。
-
(int) null→0 -
intval(null)→0 -
filter_var(null, FILTER_VALIDATE_INT)→false(注意:这个不转成0)
什么时候不该依赖(int) null === 0
当你需要区分“字段不存在”“字段明确为null”和“字段值为0”时,强制转int会抹掉语义。比如数据库里score允许NULL表示“未评分”,而0表示“评了但得分为零”——两者业务含义完全不同。
使用场景举例:API响应构造、ORM属性赋值、表单提交后数据清洗。
立即学习“PHP免费学习笔记(深入)”;
- 用
is_null($val)单独判断,比依赖转换结果更可靠 - 如果必须转整型且保留
null语义,优先用filter_var($val, FILTER_SANITIZE_NUMBER_INT),它对null返回''(空字符串),不会静默变成0 -
??操作符配合(int)看似简洁:(int)($val ?? 0),但若$val本身就是null,这行代码没带来任何额外保护
intval()和(int)在处理null时有区别吗
没有实质区别。两者对null都返回0,但参数机制不同:后者是强制类型转换操作符,前者是函数,支持第二个参数base(进制),不过对null传任何base都没影响。
性能/兼容性影响:(int)略快,无函数调用开销;intval()在PHP 8.1+对null仍保持向后兼容,但文档已标注“不推荐用于非标量值”。
-
(int) null和intval(null)结果相同,都是0 -
intval(null, 16)仍是0,十六进制解析逻辑根本不触发 - 如果变量可能为数组或对象,
(int)会报Notice: Object of class X could not be converted to int,而intval()静默返回0——这是真坑,容易掩盖类型错误
真正稳妥的null→int转换写法
所谓“稳妥”,是指能明确表达意图:你是想“补默认值”,还是“清洗非法输入”,还是“保留空值语义”。没有银弹,只有上下文适配。
可读性比一行短更重要。比如入库前确保字段是整数,又接受null为合法空值,那就别转——让数据库或ORM自己处理NULL;如果协议要求必须是数字,则显式声明默认值。
- 明确补默认值:
$score = $data['score'] ?? 0;(先取值,再转:(int)($data['score'] ?? 0)) - 过滤非法输入:
$score = filter_var($data['score'], FILTER_VALIDATE_INT) ?: 0;(注意?:会把false和0都当假值,所以0会被覆盖成0,看似冗余实则防错) - 保留
null语义:$score = is_int($data['score']) ? $data['score'] : null;,其他类型一律拒绝
最常被忽略的是:很多开发者以为(int) null是“安全转换”,却没意识到它同时把false、''、[]甚至'abc'都吞成了0。真要健壮,得先做类型校验,再考虑转换。











