(string)true转为"1",(string)false转为空字符串"";需用三元运算符或var_export()显式转为"true"/"false"字符串,避免隐式转换引发逻辑错误。

PHP里布尔值不是字符串,true 和 false 是独立类型,直接转成字符串会变成 "1" 或空字符串 "",而不是你想要的 "true" 或 "false" —— 这是绝大多数人踩坑的起点。
用 (string) 强制转换会得到什么?
它不按字面量转,而是按“真/假值映射”转:true 变成 "1",false 变成 ""(空字符串)。这不是 bug,是 PHP 的隐式规则,但和直觉冲突。
-
(string)true→"1" -
(string)false→"" -
strval(true)结果一样,也是"1" - 如果后续要 JSON 输出、HTTP 参数拼接或日志记录,这种结果大概率导致后端解析失败或前端误判
需要字符串 "true"/"false" 时怎么办?
别依赖强制转换,写个简单逻辑或封装函数。最稳妥的是三元表达式,清晰且无歧义:
$s = $bool ? 'true' : 'false';
也可以复用已知可靠的工具函数,比如 ThinkPHP 提供的 bool_to_string(),它默认小写,支持大小写切换:
立即学习“PHP免费学习笔记(深入)”;
bool_to_string(true); // "true" bool_to_string(false); // "false" bool_to_string(true, false); // "True"
注意:不要用 json_encode() 临时救急——它输出带引号的 "true",但多一层 JSON 转义,不适合直接拼 query string 或日志。
从外部输入(如 $_POST、json_decode())拿到的 "true" 怎么还原?
这是反向问题,但常和前两者混在一起出错。字符串 "true" 不等于布尔 true,is_bool("true") 返回 false,而且 "true" == true 居然为 true(因为非空字符串转布尔是 true),但 "true" === true 是 false。
- 必须用
filter_var($input, FILTER_VALIDATE_BOOLEAN)来安全还原 -
filter_var("true", FILTER_VALIDATE_BOOLEAN)→true -
filter_var("false", FILTER_VALIDATE_BOOLEAN)→false -
filter_var("1", FILTER_VALIDATE_BOOLEAN)→true;"0"→false;其他字符串如"yes"也支持 - 别用
(bool)"false"—— 它永远是true,因为非空字符串在布尔上下文中都为真
http_build_query() 里的布尔值会怎么变?
它内部对布尔值做 (string) 转换,所以 true → "1",false → "0"。很多后端接口要求参数是 is_admin=true 这种形式,而不是 is_admin=1,否则可能被当成整数校验失败。
解决方法是在调用前递归处理数组:
array_walk_recursive($data, function (&$v) {
if (is_bool($v)) {
$v = $v ? 'true' : 'false';
}
});
echo http_build_query($data); // id=1&is_admin=false
注意:这个修改是原地的,如果原始数组还要复用,得先 array_merge([], $data) 拷贝一份。
真正容易被忽略的点是:类型转换不是单向操作,而是一组上下文敏感的动作。true 到字符串、字符串到 true、http_build_query 中的隐式行为——这三者规则完全不同,不能靠“差不多”混着用。每次转换前,先问自己:目标系统认什么?是 PHP 自己用,还是传给 JS、Python 或 Java 后端?答案不同,处理方式就该立刻切换。



















