empty()返回true的值有:null(含未定义变量)、false、0、0.0、""、"0"、[]、无属性的对象;其中"0"是硬编码特例,并非类型转换所致。

empty() 判定为 true 的具体值有哪些
PHP 的 empty() 会把以下值统一当作“空”处理,返回 true:
-
null(包括未定义变量) false-
0(整型零) -
0.0(浮点零) -
""(空字符串) -
"0"(字符串 "0" —— 这是最容易踩坑的一条) -
[](空数组) - 无属性的对象(如
new stdClass())
注意:"0" 被判空是 empty() 的硬编码行为,不是类型转换结果;它和 0 == "0" 的松散比较无关,而是语言结构层面的特例。
为什么 "0" 会被 empty() 当作空值
这不是 bug,是 PHP 从早期就确立的语义:把字符串 "0" 视为“逻辑上无意义的占位值”,类似表单里用户只输入了一个零却没填有效内容。但这个设计和直觉冲突,尤其在处理 ID、状态码、金额字段时极易出错。
典型误判场景:
- 表单提交
status="0"(表示“已关闭”),empty($_POST['status'])返回true,导致逻辑跳过 - API 返回 JSON 中的数值
0经json_decode()变成 int,empty()判为真;但若前端传的是字符串"0",结果一样 -
$_GET['page'] = "0",用empty()判断分页参数是否提供,结果误认为没传
想精确判断“是否为纯空字符串”该用什么
唯一可靠写法是 $var === ''。它不触发类型转换,不关心 0、false 或 null,只认准“长度为 0 的字符串”。
其他常见错误写法对比:
-
empty($var)→ 对"0"、0、null全部返回true -
$var == ''→0 == ''和false == ''都为true,但"0" == ''是false,行为不一致 -
strlen($var) == 0→ 若$var是null或未定义,会触发 warning;需先is_string($var)校验
判断数组是否为空要小心什么
empty($arr) 只反映“数组结构是否为空”,即 count($arr) === 0。但它对这些情况全部返回 false:
-
$arr = [''](含空字符串) $arr = [null]$arr = [0, false, ' ']
如果业务上要求“数组里不能有任何假值或空白”,就不能只靠 empty(),得组合 array_filter($arr, 'strlen') 或自定义回调过滤后再 count() 判断。更关键的是:别把 empty($arr[0]) 当作“数组有数据”的反向依据——它可能只是第一个元素碰巧为空。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











