empty() 判断的是值是否等价于布尔 false,因此 0、"0"、""、null、false 等均返回 true;它不是判断“是否有值”,而是松散比较下的假值判定,字符串 "0" 被判空是设计使然而非 bug。

empty 把 0 当空,是因为它本质是 !isset($var) || $var == false
PHP 的 empty() 不是“判断有没有值”,而是“判断是否等价于布尔 false”。它内部逻辑近似于 !$var(注意不是 !== false),而 PHP 在松散比较中把整数 0、浮点数 0.0、字符串 "0"、空字符串 ""、null、false 全部转为布尔 false。所以 empty(0) 返回 true 是设计使然,不是 bug。
字符串 "0" 也被判空,这是最常踩的坑
很多业务场景里,"0" 是合法且有意义的值:比如开关状态("0" 表示关闭)、订单状态码("0" 表示待支付)、API 返回的字符串型数字字段。但 empty("0") 仍返回 true,导致逻辑跳过或误判。
- 表单提交时用户输入了
"0",!empty($_POST['price'])会认为没填 - 数据库查出字段值是字符串
"0"(如 ENUM 或 CHAR 类型),empty($row['active'])直接当失效处理 -
isset($str) && $str !== ''可以避开"0"问题,但不防null;更稳妥的是isset($str) && is_string($str) && $str !== ''
判断非空字符串,别只靠 !empty()
如果目标明确是“非空字符串”,!empty($str) 太宽泛。它无法区分 "0"、"false"、" "(带空格)这些情况。
-
is_string($str) && $str !== '':确保是字符串且非空,排除0、false、null -
trim($str) !== '':适合要忽略首尾空白的场景,但注意trim("0") === "0",不会误杀 - 需要兼容 null/undefined?用
isset($str) && is_string($str) && trim($str) !== '' - 对数组元素做类似判断?避免
empty($arr['key']),改用array_key_exists('key', $arr) && is_string($arr['key']) && $arr['key'] !== ''
isset 和 empty 的分工必须清楚
isset() 只回答“这个变量是否存在且不为 null”,empty() 回答的是“这个值在布尔上下文中是否为 false”。两者目的不同,混用必然出错。
立即学习“PHP免费学习笔记(深入)”;
-
$x = 0;→isset($x)是true,empty($x)是true -
$x = "0";→isset($x)是true,empty($x)是true -
unset($x);→isset($x)是false,empty($x)是true(且不报 Notice) - 真正安全的“存在且非空”判断,往往是组合:比如
isset($val) && $val !== '' && $val !== '0'(按需加条件)
empty() 快速兜底,还是用显式类型+值判断守住边界。后者多敲几行,但少修三天线上 bug。



















