结论:用 === "" 区分空字符串与 "0" 或 0,因类型敏感且精准;empty() 不适用,因其将 0、"0"、"" 均判为 true,无法区分语义。

直接说结论:用 === 区分 0 和 "",但必须先确认类型;empty() 不能用于这种区分,它俩在 empty() 下都返回 true。
为什么 empty("0") 和 empty(0) 都是 true
empty() 的设计目标不是“判空字符串”,而是“判 falsy 值”——它把 0、"0"、false、null、[] 全部归为一类。所以当你想区分“用户填了零分”和“用户根本没填”,empty() 会直接把你俩都吞掉。
-
empty(0)→true(整数零) -
empty("0")→true(字符串零) -
empty("")→true(空串) - 三者语义完全不同,但
empty()不care
=== "" 只能抓空字符串,不碰 0
这是最干净的空串判断方式,但它对类型敏感:只对字符串类型生效,其他类型一律返回 false。
-
0 === ""→false(类型不同,安全) -
"0" === ""→false(内容不同,安全) -
"" === ""→true(精准命中) - 隐患:如果变量是
null或未定义,$var === ""不报错但结果是false,容易漏掉 null 场景
表单里怎么安全判断“真没填”还是“填了0”
来自 $_POST 或 $_GET 的值永远是字符串,所以你拿到的 "0" 和 "" 天然可区分,关键在于别用错函数。
- 先用
isset($_POST['score'])确认键存在(排除未提交) - 再用
$_POST['score'] === "0"判断是否填了零 - 用
trim($_POST['score']) === ""判断是否为空或全空白 - 绝对不要写
!$_POST['score']或empty($_POST['score'])—— 它们会让"0"消失 - 如果字段允许数字但需校验格式,优先用
filter_input(INPUT_POST, 'score', FILTER_VALIDATE_INT),它对"0"返回0,对""返回false,天然分离
is_numeric($x) && (int)$x === 0 是个危险组合
这个写法看似聪明,实则埋雷:它会把 "0.0"、"00"、"0e0" 全当 0,而业务上这些很可能不是合法输入。
-
is_numeric("0.0")→true,(int)"0.0"→0,结果误判 -
is_numeric("00")→true,(int)"00"→0,但“00”可能表示格式错误 - 真正需要数值零时,应先转类型再比:
filter_var($x, FILTER_VALIDATE_INT) === 0(只认整数) - 若接受浮点零,用
filter_var($x, FILTER_VALIDATE_FLOAT) !== false && (float)$x === 0.0
最易被忽略的一点:你写的判空逻辑,往往只覆盖了 "" 和 "0",但线上真实数据还可能带 BOM、零宽空格、全角空格、不可见控制字符——trim() 默认不处理这些,得手动加字符集,否则 trim($s) === "" 会失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











