empty() 不可靠,因其判断 falsy 值而非字符串长度,会将"0""false"等非空字符串误判为空;安全判空应使用 strlen($str)===0 或 $str==="",需严格比较且 trim() 可处理空白。

直接用 empty() 最省事,但要注意它会把 "0"、"0.0"、"false" 这类“非空但为假”的字符串也判为空 —— 如果你只关心“有没有字符”,就得换别的方法。
为什么 empty() 不总是可靠
empty() 判断的是“是否为 falsy 值”,不是“是否长度为 0”。它对以下字符串返回 true(即“为空”),但它们明明有内容:
-
"0"(一个数字字符) "0.0""false"-
" "(含空格的字符串,但empty(" ")是false,因为有空格)
所以如果你在处理表单输入、API 返回值或配置项,且需要区分 "0" 和真正的空字符串 "",empty() 就会出错。
真正检测“字符串是否为空”的安全写法
用 strlen() 或 === "" 最直接:
立即学习“PHP免费学习笔记(深入)”;
-
strlen($str) === 0:明确检查字节长度是否为 0(推荐用于 ASCII/UTF-8 环境) -
$str === "":严格等于空字符串(注意必须用===,==会触发类型转换) - 如果要同时过滤纯空白(空格、制表符、换行等),先
trim($str) === ""
示例:
$str = "0"; var_dump(empty($str)); // bool(false) —— OK,不为空 var_dump($str === ""); // bool(false) —— OK var_dump(strlen($str) === 0); // bool(false) —— OK $str = ""; var_dump(empty($str)); // bool(true) var_dump($str === ""); // bool(true) var_dump(strlen($str) === 0); // bool(true)
PHP 8+ 可用 str_starts_with()?不,别乱套
str_starts_with() 是用来判断前缀的,和“是否为空”无关。有人误以为 str_starts_with($s, "") 能检测空字符串,但它对任何字符串都返回 true(因为空字符串是所有字符串的前缀),完全不可用。
同理,strpos($s, "") 也永远返回 0,不能用于判空。
这类函数不是设计来解决这个问题的,硬套只会引入隐蔽 bug。
真正容易被忽略的是:UTF-8 多字节字符下 strlen() 返回的是字节数,不是字符数;但判空时无所谓 —— 因为只要有一个字符(哪怕是一个 emoji),strlen() 就大于 0。所以它依然安全。只是别把它和“字符计数”混淆。



















