最推荐用 $str === "" 严格判断空字符串,它不进行类型转换,可准确区分 "" 和 "0";若需忽略首尾空白则用 trim($str) === "";避免使用 empty() 或 ! $str,因其会将 "0" 误判为空。

用 empty() 判断字符串是否为空最常用,但要注意它会把 "0" 也当空
empty() 是 PHP 中最常被用来判断“空值”的函数,它对 ""、null、false、0、0.0、[] 都返回 true。字符串场景下,它确实能识别空字符串,但有个关键陷阱:empty("0") 也会返回 true —— 因为 PHP 把字符串 "0" 当作 falsy 值处理。
如果你的业务里可能有合法的字符串 "0"(比如商品库存字段、开关状态),就不能直接用 empty()。
- 适合场景:表单提交后快速过滤掉明显没填的内容(如昵称、地址)
- 不适合场景:需要区分
""和"0"的数值型字符串字段 - 等价写法:
!$str和empty($str)行为一致,同样踩"0"的坑
严格判断空字符串要用 === "" 或 strlen() === 0
要真正只判断“是不是一个长度为 0 的字符串”,必须绕过类型转换。最直接的方式是用恒等比较:$str === ""。它不会做任何类型转换,"0"、null、false 全部不匹配。
strlen($str) === 0 效果一样,且在 PHP 8+ 中对 null 会抛 TypeError,所以使用前最好确认变量已定义或加 isset() 保护。
立即学习“PHP免费学习笔记(深入)”;
-
$str === "":安全、直观、推荐用于明确只关心“空字符串”的逻辑 -
strlen($str) === 0:性能略优(尤其长字符串),但$str为null时会报错 - 别写
strlen($str) == 0:弱比较可能把false算成 0,导致误判
需要同时处理 null、false、空白字符?用 trim() + === ""
用户输入常带空格、制表符或换行,比如 " \t\n "。单纯用 === "" 会放过这些“视觉上为空”的字符串。这时候得先清理再判断。
标准做法是:trim($str) === ""。它会去掉首尾所有空白字符(包括 Unicode 空格),再比对是否为空字符串。注意:trim() 对 null 返回 "",所以 trim(null) === "" 是 true —— 这通常符合预期(未填写也算空)。
- 适用场景:表单验证、用户昵称/搜索关键词等需忽略首尾空白的输入
- 不适用场景:需要保留原始空白的协议解析或日志处理
- 避免用
empty(trim($str)):又绕回了"0"的坑
PHP 8 的 str_starts_with() 和 str_ends_with() 不解决空判断问题
有人看到 PHP 8 新增了字符串函数,误以为它们能替代空判断。其实 str_starts_with($str, "") 永远返回 true,str_ends_with($str, "") 同理 —— 空字符串是所有字符串的前缀和后缀。它们跟“是否为空”完全无关。
真正要判断空,还是回到前面三个方法。新函数只在你需要检查“是否以某非空子串开头/结尾”时才有用,比如 str_starts_with($path, "/api/")。
空字符串判断看似简单,但 "0"、null、空白字符这三类边界情况混在一起,一不留神就埋下线上 bug。选哪个方式,得看你的字段语义到底要表达“没填”,还是“填了但内容为空”,还是“填了但全是空格”。



















