empty() 判断的是 falsy 值而非字面“空”,会误判 0、"0"、false;需根据业务语义选择 isset()、=== ''、trim() === '' 或 count() === 0 等更精准方式。

用 empty() 判断变量是否为空最常用,但要注意它会把 0、"0"、false 也当“空”
empty() 是 PHP 中最常被用来判断“是否为空”的函数,但它其实判断的是“是否为 falsy 值”,不是字面意义上的“空”。比如:empty(0)、empty("0")、empty(false) 都返回 true,这在处理表单数字输入或 API 返回值时容易出错。
适用场景:快速过滤掉用户没填、没传、或明显无效的字段(如用户名、邮箱字符串)。
常见错误现象:
用户提交了数字 0 作为年龄或库存,结果被 empty() 当成空跳过校验。
- 如果变量可能为
0或"0",别单独依赖empty() - 想排除
null、未定义、空字符串但保留0,改用$var === '' || $var === null || !isset($var) - 更稳妥的写法是组合判断:
!isset($var) || $var === ''(不触发"0"的误判)
isset() 和 is_null() 的区别:一个看“是否存在且非 null”,一个只看“是不是 null”
isset() 返回 false 的情况有三种:变量未定义、值为 null、值为 unset() 过。它不会报 Notice,适合做前置防御。
is_null() 只判断值是否严格等于 null,但变量未定义时会抛 Notice: Undefined variable —— 所以必须先确保变量存在,或配合 @ 抑制(不推荐)。
- 检查表单字段是否提交:
isset($_POST['username'])比!empty($_POST['username'])更安全 - 想确认某个配置项明确被设为
null(而非没设),才用is_null($config) -
isset($var) === false等价于!isset($var),但后者更常见
字符串场景下优先用 trim($str) === '',而不是 empty($str)
用户输入常带空格,empty(" ") 返回 false(因为非空字符串),但实际你想把它当“空”处理。
性能上,trim() 比 empty() 略慢,但对绝大多数 Web 请求可忽略;语义上它更贴近业务需求——“有没有有效内容”。
- 登录用户名、搜索关键词、地址字段等,一律先
trim()再判断 - 避免写成
empty(trim($str))——trim()返回字符串,empty()又多一层隐式转换,直接trim($str) === ''更清晰 - 如果还要兼容全角空格、换行符,用
preg_replace('/\s/u', '', $str) === ''
数组是否为空,empty($arr) 安全,但 count($arr) === 0 更明确
empty($arr) 对空数组返回 true,对含 null 元素的非空数组也返回 false,行为稳定,可用。
但 count() 更直白,且 PHP 7.2+ 对空数组做了优化,性能差异几乎为零;另外,当你需要区分“未设置”和“设了但为空数组”时,必须拆开判断:
- 只关心数组里有没有元素:
count($arr) === 0 - 要同时覆盖未定义、
null、空数组:!isset($arr) || !is_array($arr) || count($arr) === 0 -
array_filter($arr)不能代替空判断 —— 它会过滤掉所有 falsy 值(包括0、false),导致误判
0 算合法还是非法?选函数之前,先定语义。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











