true转int是1,false转int是0,这是php语言规范强制规定的类型转换规则,适用于显式转换((int)、intval())和隐式转换(算术运算、数组键等),且与mysql的tinyint(1)存储行为一致。

PHP里true和false转成整数分别是多少
直接说结论:true转int是1,false转int是0。这不是约定俗成,而是PHP语言规范明确规定的强制转换规则。
常见错误现象:有人在数据库写入或API返回时,把bool字段直接塞进INT列,结果发现false存成了0、true存成了1,但自己没意识到这是隐式转换——不是“刚好对”,而是“必然如此”。
- 显式转换推荐用
(int)或intval(),行为一致;settype($x, 'int')也一样 - 隐式转换发生在很多地方:算术运算(如
$x = true + 5→6)、数组键([true => 'a']等价于[1 => 'a'])、JSON编码(json_encode(true)输出"true",但若先转int再编码就变成"1") - 注意
0、""、null、[]这些“falsy值”转int也都是0,但它们本身不等于false——别因为结果相同就混为一谈
为什么false === 0在PHP里是false
因为===是严格比较,类型不同直接判假。哪怕(int)false === 0成立,false === 0也永远不成立。
使用场景常出现在条件判断误用:比如写if ($flag === 0)想判断“关闭状态”,但$flag其实是bool类型,这时永远进不去分支——它要么是true(非0),要么是false(类型不对)。
立即学习“PHP免费学习笔记(深入)”;
- 检查布尔值,请用
if ($flag)或if ($flag === true),别用=== 0或== 0 -
==会触发类型转换:false == 0、false == ''、false == null全为true,非常容易踩坑 - 数据库取出来的
TINYINT(1)字段,PDO默认可能返回string或int,不是bool——别假设它和PHP的true/false自动对等
intval()和(int)在布尔转换上有没有区别
没有区别。对bool类型输入,intval(true)、(int)true、settype($x, 'int')三者结果完全一致,都是1或0。
但注意参数差异:intval()第二个参数可指定进制(如intval('101', 2)),而(int)不支持;不过这个能力对bool无效——传bool进去,进制参数被忽略。
- 性能上无差别,底层都走相同的zval类型转换逻辑
- 如果变量可能为
null或string,intval()更安全(intval(null)返回0,(int)null也一样) - 别用
filter_var($x, FILTER_VALIDATE_INT)来转布尔——它对true/false返回false(验证失败),不是转换
MySQL写入时BOOL字段实际存的是什么
MySQL根本没有真正的BOOL类型,它只是TINYINT(1)的别名。所以PHP里的true写进去就是1,false就是0,和PHP转整型结果一致,但这是两层独立转换:PHP → int → MySQL。
容易踩的坑在于读取:PDO默认把TINYINT(1)当int返回(值是0或1),不是bool。你不能指望$row['active'] === true成立,除非手动映射。
- PDO预处理时加
PDO::ATTR_EMULATE_PREPARES => false并配合PDO::MYSQL_ATTR_FOUND_ROWS => true,也不会改变这个行为 - 如果用Laravel Eloquent,
$casts = ['active' => 'boolean']能自动转,但底层仍是读int再转bool,不是数据库直出 - 直接执行
SELECT active FROM users,返回的active字段值是0或1(int型),不是false/true——这点很多人上线后才发现
bool,其实大概率是int,而这个“理所当然”的错觉,比转换规则本身更容易引发bug。











