'' == 0 返回 true 是因 PHP 松散比较时将空字符串转为整数 0 后比较,而严格比较 '' === 0 为 false;应使用类型检查加值判断或 strcmp 等字符串函数确保语义准确。

直接用 == 比较空字符串和 0 会返回 true,但这不是“相等”,而是 PHP 自动类型转换后的隐式结果——它把空字符串转成整数 0 再比。真要判断语义是否一致,得看你要解决什么问题。
为什么 '' == 0 是 true?
PHP 在松散比较(==)时,会按规则把两边转成同一类型再比。空字符串 '' 转整型就是 0,所以 '' == 0 成立。同理:'0' == 0、'0.0' == 0、甚至 'abc' == 0 都是 true——因为非数字开头的字符串转整型一律为 0。
-
var_dump('' == 0);→bool(true) -
var_dump('abc' == 0);→bool(true) -
var_dump('123abc' == 123);→bool(true)(取前导数字)
怎么安全地区分空字符串和数字 0?
关键在类型:空字符串是 string,0 是 int。用严格比较(===)能立刻拆穿:
-
'' === 0→false(类型不同) -
'' === ''→true -
0 === 0→true
如果变量来源不可控(比如来自 $_GET 或 JSON),先确认类型再判断:
立即学习“PHP免费学习笔记(深入)”;
- 检查是否为纯空字符串:
is_string($var) && $var === '' - 检查是否为整型零值:
is_int($var) && $var === 0 - 若需兼容字符串数字
"0",用filter_var($var, FILTER_VALIDATE_INT) !== false && (int)$var === 0
用 empty() 判断时要注意什么?
empty() 把 ''、0、false、null、[] 全当“空”,但它不区分它们。这意味着:
-
empty('')→true -
empty(0)→true -
empty('0')→true(字符串"0"也被判为空!)
所以别靠 empty() 来判断“是不是 0”或“是不是空字符串”,它只适合做粗粒度的存在性检查。业务上要区分 0 和 ''(比如 ID 字段允许为 0,但不允许未提交),必须用类型+值组合判断。
字符串内容比较该用哪个函数?
如果目标是判断两个字符串字面值是否完全一致,别用 == 或 === 做“值比较”,而要用专门的字符串函数:
-
strcmp($a, $b) === 0:区分大小写,返回0表示完全相同 -
strcasecmp($a, $b) === 0:忽略大小写 - 注意:
strcmp()返回的是 ASCII 差值,必须用=== 0判断,不能只用== 0(否则-0可能被误判)
比如:strcmp('', '0') 返回负数('' < '0'),strcmp('0', '0') 才返回 0。
最常被忽略的一点:表单传来的 0 几乎总是字符串 "0",不是整型 0。不加类型检查就用 == 0,等于默认接受所有非数字字符串为“0”,这在权限、状态码、ID 校验等场景里极易引发逻辑漏洞。



















