strlen() == 0 和 empty() 有什么区别吗?

8

我在看别人写的一些表单验证代码时,发现了这个:

strlen() == 0

在测试表单变量是否为空时,我使用empty()函数。是否有更好的方法呢?它们在功能上是等效的吗?

9个回答

10

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

你(和其他几个人)所说的正是我想的。我从未见过有人尝试使用 strlen 来检查变量是否为空,我对他们的代码是否真正产生了预期效果表示怀疑。感谢大家的澄清。 - red4d
为什么这个易读(且被接受)的答案只有一次赞同?它有错误吗? - mwfearnley
如果我写出这样的条件,它是什么意思?布尔值还是其他? @red4d @dpp如果 (!strlen($_POST['id'])) { //blah } - Mr world wide
我认为被接受的答案应该强调主要区别在于当测试“0”字符串时,strlen()==0会返回false,而empty()会返回true。有些人可能会将在字符串上调用empty()视为等同于检查它是否等于空字符串,这是错误的,因为存在这种容易出错的边缘情况! - fbastien

9

有几种情况下它们会有不同的行为:

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.

8
以下内容被认为是空的:
"" (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等数据类型。请问您的情况是什么?

参考资料


3

2
$f = 0; echo empty($f)? 'Empty':'Full'; // empty
$f = 0; echo strlen($f); // 1

对于表单,我使用isset。这样更加明确易懂。;-)


2

empty是布尔值false的相反。

empty是一种语言结构。

strlen是一个函数。

strlen返回字符串的字节长度。

strlen($str)==0是比较字节长度是否为0(宽松比较)。

如果字符串为空,则该比较将得到true - 如果字符串长度为零,则empty($str)表达式也会得到true。

然而,对于其他任何情况:

empty是布尔值false的相反。

strlen返回字符串的字节长度。

它们之间没有太多共同点。


嗨,hakre。首先,让我说一下,我真的很谨慎地质疑一个声誉如你的人的陈述,但是你是否意味着空值是false的相反?当然,true才是false的相反,而empty与false是相同的吧?也许是我老了..! - Geoff Kendall
1
@GeoffKendall:请看这里:PHP:empty()是布尔变量的反义词 - hakre

1
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()-方法。对象是固执的生物。

0

empty() 适用于所有变量类型。我认为,strlen() 更适合用于字符串或可以安全转换为字符串的内容。例如,

strlen(array());

会抛出 PHP 警告:strlen() 函数期望参数 1 是字符串,但实际传递了数组 错误


0

当输入为0时,

strlen(0) = 1
empty(0) = false <-- non-empty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接