(int) true 和 intval(true) 均返回 1,这是 php 明确定义的布尔转整型规则;但混用易掩盖类型问题,导致逻辑错误或扩展困难。

PHP中true强制转int结果是1
直接结论:(int) true 和 intval(true) 都返回 1,(int) false 返回 0。这不是约定俗成的“映射”,而是PHP语言层面对布尔值到整型的明确定义。
常见错误现象:有人把true转int当成“判断是否为真”的中间步骤,结果在算术运算里误用,比如$score = $is_valid + 10;——若$is_valid是true,$score就变成11,而非预期的“保持原值或跳过”。
-
(int) true、intval(true)、settype($x, 'int')(当$x === true)三者行为一致 - 注意和业务语义冲突:比如数据库字段
is_active TINYINT(1)存1/0,PHP里取出来是整数;但若从API收到{"is_active": true},json_decode后是布尔值,直接(int)转换会得到1,可能掩盖了数据格式不一致问题 - PHP 8.0+ 启用严格类型时,函数参数声明
int $flag,传入true会触发TypeError,反而能提前暴露类型混用
intval()和(int)对布尔值没区别,但对其他类型有关键差异
对布尔值,两者完全等价;但一旦变量类型不确定,行为就开始分叉。
例如字符串"123abc":(int) "123abc"截取开头数字得123,而intval("123abc")同样返回123;但字符串"abc123"两者都返回0。
- 浮点数:
(int) 7.99→7(向下取整),intval(7.99)→7,行为一致 - 空数组:
(int) []→0(先转bool为false,再转int),intval([])→0,也一致 - 非空数组:
(int) [1,2]→1(数组转bool为true,再转int),intval([1,2])→0(intval对非标量直接返回0)——这里开始出现分歧 - 对象:
(int) new stdClass()和intval(new stdClass())都是0,且都不会调用__toString()
别让true转int掩盖类型校验缺失
真正危险的不是true变1,而是你本该检查值是否为布尔,却放任它悄悄进到整数上下文中参与计算或存储。
- 数据库写入前,如果字段定义为
TINYINT,应显式做$value === true ? 1 : ($value === false ? 0 : null),而不是依赖自动转换 - API响应中布尔字段(如
"success": true)被json_decode($json, true)转成数组后,取$data['success']仍是布尔值,直接(int)没问题;但若忘了第二个参数,得到stdClass对象,(int)就恒为0,逻辑全崩 - 用
filter_var($input, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)比靠(int)更安全,尤其处理用户输入时
true当1用,往往意味着你本该用枚举或状态码的地方,退化成了布尔开关——后期加第三种状态时,整个数值逻辑就得重写。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











