php中布尔值转整型:true恒为1、false恒为0,推荐(int)强制转换;松散比较易出错,须用===严格判断;json不转换布尔值;表单字符串需显式校验。

PHP里true和false转int直接用强制类型转换就行
PHP中布尔值转整型没有歧义:true恒为1,false恒为0。不需要函数、不依赖上下文,(int)或intval()都行,但推荐前者——更明确、无额外开销。
-
(int) true→1,(int) false→0 -
intval(true)也返回1,但intval()本质是“取整”,对非数字字符串才做解析,这里纯属绕路 - 别用
settype($var, 'integer'),它会修改原变量,且语义不清
用==比较时布尔和整数自动转换容易出错
PHP松散比较(==)会隐式转换类型,true == 1和false == 0都为true,但true == 2也是true——因为2被当作“真值”参与布尔判断,不是转成整型再比。
- 想严格判断值和类型是否一致,必须用
===:true === 1是false - 数据库查出来字段是
TINYINT(1)(常被当布尔存),PHP读出来是int,直接if ($row['is_active'] == true)可能误判——比如值是2也会进分支 - 安全写法是:
$row['is_active'] === 1或(bool) $row['is_active'] === true
json_encode()输出布尔值不会变成1/0
很多人以为PHP数组里布尔值经json_encode()后会转成数字,其实不会:json_encode(['flag' => true]) 输出的是{"flag":true},不是{"flag":1}。
- 前端JS接收到的是原生
true/false,不是数字,直接用if (data.flag)没问题 - 如果后端API文档要求布尔字段必须是
0/1(比如对接老系统),得手动转换:'flag' => (int) $bool - 注意:
JSON_NUMERIC_CHECK选项对布尔值无效,它只影响数字字符串
从表单/URL接收的0和1字符串不能直接当布尔用
HTTP传参全是字符串,$_GET['active']拿到的是"1"或"0",不是布尔值。直接if ($_GET['active'])会导致"0"也被判为true(因为非空字符串恒为真)。
立即学习“PHP免费学习笔记(深入)”;
- 正确做法是显式比对:
$_GET['active'] === '1'或filter_var($_GET['active'], FILTER_VALIDATE_BOOLEAN) -
FILTER_VALIDATE_BOOLEAN会把"1"、"true"、"on"、"yes"转成true,"0"、"false"、"off"、"no"转成false,其余返回null - 别用
(bool) $_GET['active']——"0"转过去还是true
最常被忽略的一点:类型转换本身很简单,难的是搞清「谁在转」「什么时候转」「转完拿去干啥」。尤其在接口边界、数据库映射、表单处理这些地方,松散类型会让真假值悄悄变形。










