我在看别人写的一些表单验证代码时,发现了这个:
strlen() == 0
在测试表单变量是否为空时,我使用empty()
函数。是否有更好的方法呢?它们在功能上是等效的吗?
strlen
是用来获取字符串中字符数量的函数,而 empty
则用于测试变量是否为空。
empty 的含义:
empty("") //is empty for string
empty(0) // is empty for numeric types
empty(null) //is empty
empty(false) //is empty for boolean
有几种情况下它们会有不同的行为:
empty('0'); // returns true,
strlen('0'); // returns 1.
empty(array()); // returns true,
strlen(array()); // returns null with a Warning in PHP>=5.3 OR 5 with a Notice in PHP<5.3.
empty(0); // returns true,
strlen(0); // returns 1.
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
var $var; (a variable declared, but without a value in a class)
strlen()函数仅检查字符串长度是否为0,不会检查int、float等数据类型。请问您的情况是什么?
$f = 0; echo empty($f)? 'Empty':'Full'; // empty
$f = 0; echo strlen($f); // 1
对于表单,我使用isset
。这样更加明确易懂。;-)
empty
是布尔值false的相反。
empty
是一种语言结构。
strlen
是一个函数。
strlen
返回字符串的字节长度。
strlen($str)==0
是比较字节长度是否为0(宽松比较)。
如果字符串为空,则该比较将得到true - 如果字符串长度为零,则empty($str)
表达式也会得到true。
然而,对于其他任何情况:
empty
是布尔值false的相反。
strlen
返回字符串的字节长度。
它们之间没有太多共同点。
strlen
方法几乎是完美的,如果你想检查某个字符串是否为空,也就是说,单个零不应该被视为无值,但空字符串、空数组、null和false都应该被视为无值。这种情况经常出现。
因此,我的建议是:
count($x)*strlen("$x")
假为0
null为0
空字符串""为0
空数组[]为0,不会警告
数值零为1
字符串零"0"为1
empty($x) && "$x"!=="0"
来实现,这更加直接但是有些冗长。而且令人惊讶的是,它们的时间成本几乎相等(一百万次迭代少于50ms),所以没有理由选择其中之一。另外,如果在strlen之前添加!!
(布尔转换),您将获得一个明确的0/1答案,有时它比true/false更方便(调试情况、switch等)。empty()
适用于所有变量类型。我认为,strlen()
更适合用于字符串或可以安全转换为字符串的内容。例如,
strlen(array());
会抛出 PHP 警告:strlen() 函数期望参数 1 是字符串,但实际传递了数组
错误
当输入为0
时,
strlen(0) = 1
empty(0) = false <-- non-empty
strlen
来检查变量是否为空,我对他们的代码是否真正产生了预期效果表示怀疑。感谢大家的澄清。 - red4dstrlen()==0
会返回false,而empty()
会返回true。有些人可能会将在字符串上调用empty()
视为等同于检查它是否等于空字符串,这是错误的,因为存在这种容易出错的边缘情况! - fbastien