0 == false为真但0 === false为假,因松散比较会类型转换而严格比较要求类型和值均一致;0表数量为零,false表操作失败,混用易致bug。

PHP里0 == false为真,但0 === false为假
松散比较(==)下,0和false会被判为相等,因为PHP会把两者都转成布尔值再比——而0转布尔就是false。但严格比较(===)要求类型+值完全一致:0是integer,false是boolean,所以结果必为false。
常见错误现象:
- 用
if ($var == false)判断变量是否“没值”,结果$var = 0被误判为“假”,但业务上0可能是合法数据(比如商品库存为0) - 函数返回
0时,写if (!some_func())导致逻辑跳过,实际该函数成功执行并返回了0
empty()对0和false一视同仁,但语义完全不同
empty(0)和empty(false)都返回true,但原因不同:empty()只是按规则把一批值统一归为“空”,并不区分它们的原始含义。
使用场景提醒:
立即学习“PHP免费学习笔记(深入)”;
-
empty()适合做“是否存在有效内容”的粗筛,比如表单字段是否提交、数组是否非空 - 如果需要明确知道是
0(如ID、计数器)、还是false(如函数执行失败),就不能依赖empty() -
isset($var)对0返回true,对null才返回false——它只管“是否存在且不为null”,不关心真假值
在条件判断中,0和false都会让if跳过,但来源和意图必须分清
PHP把0、false、""、null等都列为“falsy values”,所以if (0) { }和if (false) { }都不会执行。但这不意味着它们可以互换。
关键差异点:
-
false通常表示“操作失败”或“布尔否定”,比如strpos('abc', 'd')返回false -
0通常表示“数量为零”或“索引位置”,比如strpos('abc', 'a')返回0(合法且有意义) - 混用会导致经典bug:
if (strpos($str, $needle))会漏掉匹配在开头的情况,正确写法是if (strpos($str, $needle) !== false)
类型检查比值判断更可靠,尤其当变量来源不可控时
来自$_GET、$_POST或JSON解码的数字,大概率是字符串(如"0")。此时"0" == 0为true,但"0" === 0为false,而"0" == false也为true——三者全乱套。
实操建议:
- 确认是整型且需等于0:用
$var === 0(不是== 0) - 确认是布尔失败态:用
$var === false,而非!$var - 不确定类型又需安全判断:先用
is_int($var) && $var === 0,或filter_var($var, FILTER_VALIDATE_INT) !== false && $var == 0
最易被忽略的是:0和false在底层zval结构里虽然都存着“0值”,但type字段完全不同——PHP不会替你记住这个区别,得靠代码自己守住边界。



















