多数场景下用 empty() 最省心,但遇数字 0 或字符串 "0" 会误判为空;需区分未定义、null、空字符串或全空数组时,应分别用 isset()、is_null()、=== '' 或 array_filter() 配合严格判断。

直接说结论:多数场景下用 empty() 最省心,但遇到数字 0 或字符串 "0" 时它会误判为“空”——这时候必须换方法。
什么时候该用 empty()
它适合判断表单字段、API 返回值、配置项这类“有没有有效内容”的场景。比如用户没填邮箱、数据库查不到记录、JSON 解析后某个字段缺失或为空。
-
empty()对未定义变量不报错,返回true,这点比isset()和is_null()更安全 - 它把
null、""、0、0.0、false、[]、"0"全部当“空”,覆盖广 - 但正因如此,如果业务里
0是合法值(比如商品库存为 0),就不能用empty($stock)判“是否要提醒补货”
怎么安全判断变量是否为 null 或未定义
当你需要区分“变量根本不存在”和“变量存在但值是 null”,或者只关心是不是数据库里的 NULL 字段时,得用组合判断。
- 先用
isset($var):返回false表示变量未声明,或声明了但值为null - 再单独用
is_null($var):只对明确赋值为null的变量返回true,对0、""、false都返回false - 想确认“变量存在且为
null”,写成isset($var) === false || is_null($var);想确认“变量存在且不为null”,就用isset($var)
判断空字符串必须用 === ''
数据库字段允许 NULL 和空字符串共存时,empty() 会把两者都吃掉,但你可能只想过滤掉 "" 而保留 NULL(比如表示“未填写”,而 NULL 表示“不适用”)。
-
$var === ''是唯一能精准识别空字符串的方式,不会受类型转换干扰 -
$var == ''会让0、false、null全部变成true,绝对别用 - 从 MySQL 查出来的字段,如果定义为
DEFAULT NULL,PDO 默认映射为 PHPnull;但如果用了视图或CAST,有时会变成""——所以读取后先var_dump($row['field'])看真实类型,比猜强得多
数组所有值都为空怎么判断
不能只看 count($arr) === 0,那是判数组本身是否为空;你要的是“里面每个元素都算空值”。
- 最常用:
count(array_filter($arr, 'empty')) === 0,array_filter()默认用empty()过滤,留下的都是非空值 - 想更严格(比如排除
"0"),改成array_filter($arr, function($v) { return $v !== '' && $v !== null && $v !== 0 && $v !== false; }) - 注意
array_filter()不会重排键名,如果原数组是关联数组,结果仍保持键名;如需纯索引,包一层array_values()
真正容易被忽略的点是:PHP 里“空”不是单一概念,而是分层的——未定义、null、假值、空字符串、空数组,各自对应不同语义。选错判断方式,轻则逻辑错乱,重则删掉本该保留的数据。动手前先问一句:你到底想排除什么?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











