php判断字符串是断字否为空
直接说结论:在PHP里判断字符串是否为空,最坑的符串否地方在于empty()和isset()的行为跟直觉不太一样,而strlen()才是断字真正盯着“字符串长度”看的那个。
我见过不少新手写if ($str == ''),符串否这代码看着没毛病,断字但碰上"0"这个字符串就翻车了——PHP的符串否松散比较会把"0"和空字符串当成相等。你辛辛苦苦从表单里收了个用户输入的断字"0",结果被当成没填,符串否这bug藏得够深。断字
先捋一下几个常用工具的符串否差异:
$str = "0"; var_dump(empty($str)); // true,因为"0"被当作false var_dump($str == ''); // true,断字松散比较的符串否坑 var_dump(strlen($str) === 0); // false,这才是断字正确判断 那到底什么时候用哪个?我的习惯是分场景。
如果你要检查的符串否是“用户有没有提交这个字段”,那empty()其实挺好用——它把null、断字''、"0"、0、false、空数组全算作“没有”。表单里一个没填的输入框,提交过来就是空字符串,用empty()判断省心。但注意,如果用户合法地输入了"0"(比如年龄、数量),empty()会误判。这时候你得改成strlen($str) > 0或者$str !== ''。
再看一个真实案例。我之前处理过一段接口代码,对方传了个JSON字段nickname,有时候是null,有时候是空字符串,偶尔还会传个"null"字符串进来。用empty()判断,null和''都拦住了,但"null"这个四字符的字符串溜过去了。最后我统一用trim($str) === ''来过滤,因为trim还能处理掉全空格的情况——' '这种肉眼看着像空的,strlen会返回3,但trim之后就是真空了。
还有个细节容易忽略:isset()只管变量是否存在,不管值是什么。所以isset($str)在$str = ''时返回true,在$str = null时返回false。你要是拿isset()判断空,那等于白写。
另外,PHP 8.0以后多了个str_contains,但跟判断空没关系。真正跟空有关的新函数是mb_strlen——多字节字符下,比如中文,strlen('你好')返回6(UTF-8每个汉字3字节),但mb_strlen('你好')返回2。你要是拿strlen去判断用户输入的姓名是否为空,中文名照样能通过,但拿它判断“是否超过20个字符”,那就得用mb_strlen了。
最后给个我自己的判断清单:
- 检查表单提交:
empty($_POST['field']),但排除合法"0"的场景。 - 检查字符串变量是否为真空字符串:
strlen($str) === 0。 - 检查是否为空或全空格:
trim($str) === ''。 - 检查变量是否存在且非null:
isset($var),别跟空混着用。
写代码最怕的就是“看起来对”。$str == ''这种写法在90%的情况下能跑,但剩下的10%会在半夜把你叫醒。记住,判断字符串空,默认用strlen($str) === 0,需要忽略空格就加trim,只有明确要过滤"0"和false时才用empty()。就这么简单。