用 empty() 判字符串为空最常用但会误判 "0";应根据场景选 strlen($str)===0、trim($str)===0 或 isset()+is_string()+==="" 组合,避免混淆类型与语义。

用 empty() 判断字符串是否为空最常用,但要注意它会把 "0" 也当空
很多人直接写 if (empty($str)),确实能捕获 ""、null、false、0、"0" 等所有“falsy”值。但对字符串场景,"0" 是合法非空内容,这时候就会误判。
- 适合场景:你只关心“有没有实质内容”,不区分
"0"和空字符串,比如表单提交后做基础校验 - 风险点:
empty("0") === true,如果字段允许存数字字符串(如商品库存状态码),这个判断就不可靠 - 替代方案:用
strlen($str) === 0或$str === "",它们只认真正的空字符串,"0"、" "都不会被误伤
trim() 必须配合使用,否则带空格的字符串会被漏掉
用户输入经常带首尾空格,比如 " \t\n " 或 "hello "。直接用 empty() 或 === "" 都无法识别这种“视觉上为空”的情况。
- 正确姿势:
if (trim($str) === "")或if (strlen(trim($str)) === 0) - 性能提示:
trim()有开销,如果确定输入无空格(如 API 内部传参),可跳过;但处理用户输入时,不加trim()是常见疏漏 - 注意:
trim()默认只去 ASCII 空白符,含中文全角空格或 时需手动指定字符集,例如trim($str, " \t\n\r\0\x0B\xC2\xA0")
要区分 null、false、0 和空字符串?用严格比较 + 类型检查
当你的逻辑必须区分 null(未设置)、false(显式失败标志)、0(有效数值)和 ""(空文本)时,empty() 和 == 都会混淆它们。
- 推荐写法:
is_string($str) && $str === ""—— 先确保是字符串类型,再严格比对 - 如果变量可能为
null或未定义,加一层isset($str)更稳妥:isset($str) && is_string($str) && $str === "" - 避免写
$str == "",因为0 == ""为true,false == ""也为true
PHP 8+ 可用 str_starts_with() / str_ends_with()?不,它们不解决“是否为空”问题
有人看到新字符串函数就想套用,但 str_starts_with($str, "") 永远返回 true,str_ends_with($str, "") 同理——空字符串是所有字符串的前缀和后缀,完全不能用来判空。
立即学习“PHP免费学习笔记(深入)”;
- 这些函数只适用于“是否以某非空子串开头/结尾”,比如
str_starts_with($str, "https://") - 想用现代函数替代
trim()?目前没有,str_contains()也不行,它查的是子串是否存在 - 真正能简化判空的 PHP 8+ 特性是空合并运算符配合
trim():trim($str) ?: "default",但本质还是依赖trim()
trim($str) === "" 覆盖了绝大多数用户输入场景;真要抠类型和语义,就得拆成 isset() + is_string() + === ""。少有人意识到 "0" 和空格这两类边界情况,线上 bug 往往就出在这儿。



















