PHP中布尔值参与算术运算时自动转为整数:true→1、false→0,属语言明确规定;NULL也转0,字符串如"0"转整数0而非布尔false,隐式转换易致语义混淆与维护风险。

PHP布尔值参与数字运算,不是设计失误,而是语言层明确规定的隐式类型转换行为——true 就是 1,false 就是 0,在算术上下文中直接被当作整数使用。
算术运算中 bool 自动转为 int 的规则
只要布尔值出现在 +、-、*、/ 等算术操作符两侧,PHP 就会无条件将其转为整数:true → 1,false → 0。这个转换发生在运算前,且不报错、不警告。
-
NULL在同样场景下也转为0(注意:这和布尔转换无关,是NULL单独的算术规则) - 浮点数参与时,bool 仍先转
int,再由整数升格为 float 进行计算(例如true + 1.5→1 + 1.5 = 2.5) - 字符串开头非数字时(如
"abc"),若和 bool 运算,会先被转为0,再参与运算;但这是字符串转换规则,不是 bool 导致的
为什么 "0" 是 false,但参与运算却不等于 false + 1?
因为布尔转整数和字符串转布尔是两套独立规则:"0" 被 if 或 ?: 当作 false,但它本身是字符串,不是 false;只有显式或隐式转为布尔后,才可能进一步参与算术——而它不会自动变成 false 再变 0。
-
"0" + 1→ 字符串"0"转整数0,结果是1 -
false + 1→ 布尔false转整数0,结果也是1 - 但
"0" === false是false,两者类型不同,不能混为一谈
容易踩的坑:把逻辑判断和数值累加混在一起
最典型的是用布尔值做数组求和、计数器累加,或拼接进 SQL 数字字段,比如:
立即学习“PHP免费学习笔记(深入)”;
$score = $is_passed + $is_reviewed + $is_approved; // 本意是统计“通过项数”,但可读性差,且易被误读为逻辑或
- 这种写法合法,但语义模糊——
$is_passed是业务状态,不是计分项;别人读代码时第一反应是“这是布尔 OR 吗?” - 如果后续有人把
$is_passed改成字符串"yes",整个表达式就变成"yes" + ...→0 + ...,结果悄然出错 - 更安全的做法是显式转换:
(int) $is_passed + (int) $is_reviewed,或用三元:$is_passed ? 1 : 0
真正危险的不是转换本身,而是依赖隐式行为却不留痕迹——比如在函数参数里传 true 当 1 用,又没写文档或类型声明,半年后自己都忘了当初为什么这么写。



















