== 0是松散比较,会将"0"、0.0、[]、false等误判为0;=== 0是严格比较,要求类型和值均为int且为0,语义更准确、安全。

PHP中== 0和=== 0的区别必须分清
直接用== 0判断整型是否为0,会误判字符串"0"、浮点数0.0、空数组[]甚至false——它们在松散比较下都“等于0”。只有=== 0能确保类型+值双重匹配。
-
0 === 0→ true;"0" === 0→ false - 若变量可能来自表单或JSON(如
$_GET['id']),它大概率是字符串,== 0会把"0"当真0,但把"00"或"0.0"判为false——行为不一致 - 性能上无差异,但语义更安全:整型检测就该用严格比较
检测“为空或0”时,empty()不是万能解
empty($var)会把0、"0"、0.0、false、null、[]全判为true(即“空”),但它无法区分0和"0",也无法告诉你到底是哪种“空”。
- 想明确排除
0(比如ID字段允许为0,但不允许为空)→ 别用empty(),改用$var === 0 || $var === ''这类组合判断 -
empty(0)返回true,这常让新手困惑:“我传了0,怎么被当成空了?” - 如果变量可能为字符串数字(如
"0"),又需要兼容性,可用filter_var($var, FILTER_VALIDATE_INT) !== false && (int)$var === 0
is_int($var) && $var === 0才是纯整型零值的可靠写法
当业务逻辑明确要求“必须是整型,且值为0”,就不能靠隐式转换或宽松判断。例如数据库自增ID字段、状态码枚举值。
-
is_int()只认真正的int类型,(int)"0"或intval("0")生成的也是int,但原始变量如果是字符串,is_int()直接返回false - 别用
gettype($var) === 'integer'——它比is_int()慢,且功能等价 - 常见坑:
$var = 0; var_dump(is_int($var));→ true;但$var = $_GET['id'] ?? ''; is_int($var)→ false,哪怕URL里传的是?id=0(因为$_GET全是字符串)
从请求参数取值时,filter_input()比强制转换更可控
表单或URL里的数字,本质都是字符串。硬转(int)$_GET['n']会把"abc"变成0,把"12.34"变成12,掩盖真实问题。
立即学习“PHP免费学习笔记(深入)”;
- 用
filter_input(INPUT_GET, 'n', FILTER_VALIDATE_INT):合法整数返回数字,非法返回false,不会静默截断 - 配合默认值:
filter_input(INPUT_GET, 'n', FILTER_VALIDATE_INT, ['options' => ['default' => 0]]),但注意:这会让缺失参数也得0,需按需决定是否设默认 - 如果允许负数或0,别加
FILTER_FLAG_ALLOW_NEGATIVE以外的标志——FILTER_FLAG_ALLOW_OCTAL之类会意外接受"012"(八进制)
empty()、==、类型转换,最容易在边界 case(比如ID=0、开关关闭、计数器归零)上出错。关键不是选哪个函数,而是先想清楚:你到底要判断什么。











