if($val) vs. if($val != "") vs. if(!empty($val)) -- 哪个更好?

9

我看到很多人使用各种不同的方法来检查变量是否为空,似乎没有共识。我听说if($foo)if(!empty($foo))if($foo != "")是完全相同的。这是真的吗?

我知道这是一个非常简单的问题,但我真的想知道。有什么区别吗?我应该使用哪种方法?


我建议重新开放这个问题:包含if($foo != "")的替代方案*确实使它与简单的“if vs empty”问题不同 - 请参见我的答案以获取证明。 - Jon
6个回答

20

裸测试和与空字符串比较的区别

if($foo != "")在大多数情况下等同于if($foo),但并非总是如此。

要了解差异所在,请考虑比较运算符行为以及第一种情况下的转换为字符串规则和第二种情况下的转换为布尔值规则

我发现:

  • 如果$foo === array(),则if($foo != "")测试将成功(数组“大于”字符串),但if($foo)测试将失败(空数组转换为布尔值false
  • 如果$foo === "0"(一个字符串),则if($foo != "")测试将再次成功(显然),但if($foo)测试将失败(字符串"0"转换为布尔值false
  • 如果$foo是从空标签创建的SimpleXML对象,则if($foo != "")测试将再次成功(对象“大于”字符串),但if($foo)测试将失败(这样的对象转换为布尔值false

查看差异演示

更好的测试方法

首选的测试方法是if(!empty($foo)),它与上述方法不完全相同,因为:

  1. if($foo != "")存在不一致性(在我看来非常糟糕),而empty($foo)则没有这个问题。
  2. 如果$foo在当前作用域中不存在,empty($foo)不会生成E_NOTICE警告,这是它比if($foo)更大的优点。

但需要注意的是:如果$foo === '0'(长度为1的字符串),empty($foo)将返回true,这通常是(但可能不总是)您想要的结果。然而,if($foo)也会有同样的情况。

有时需要使用全等运算符进行测试

最后,在特定类型的值上进行测试时,必须对上述规则做出例外。例如,strpos可能返回0,也可能返回false,但这两个值的含义完全不同。在这种情况下,应该使用全等运算符进行测试:if(strpos() === false)


谢谢:)有很多好的答案,但当计时器降到最详细的解释时,我会接受你的答案。 - Avicinnian
@Pixelatron:谢谢。不幸的是,这个问题已经关闭,但我希望它会重新开放,因为它的深度肯定比“if vs empty”更大。 - Jon
从php 5.5开始,empty()现在可以用于任意表达式。请参见:http://php.net/manual/en/migration55.new-features.php#migration55.new-features.empty。因此,`echo empty(array());将输出1`。 - Will B.
@fyrye,我已经通过简单地删除那段内容来更新答案。感谢您的提醒! - Jon

5
不,这并不总是正确的。当你使用if($foo)时,PHP会将变量转换为布尔类型。空字符串、零整数或空数组将被视为false。有时这可能会成为问题。
你应该尽可能使用最具体的比较方式,如果你预期一个可能为空的字符串,请使用if($foo==='')(注意三个等号)。如果你希望使用(布尔)false或资源(例如来自数据库查询的资源),请使用if($foo===false){...} else {...}

0

您可以阅读关于转换为布尔值的文档来找到这个问题的答案。其中有一个列表,列出了哪些值分别被转换为truefalse

请注意,empty还检查变量是否设置,而常规比较则不会。未设置的变量在比较过程中会触发E_NOTICE类型的错误,但使用empty时不会。您可以在比较之前使用isset调用来解决此问题,像这样:

if(isset($foo) && $foo != '')

太棒了。感谢提供文档链接,现在我终于明白if()如何工作了。我想在需要的情况下只需使用if(!empty($foo)),这样就不会产生E_NOTICE了。 - Avicinnian

0

if()会将给定的语句转换为布尔值,因此查看布尔类型文档似乎是您要寻找的。一般而言:

  • 空字符串("")、空数组(array())、零(0)和布尔值false(false)被视为false
  • 其他所有值("foo"1array('foo')true等)都被视为true

编辑:
如需更多信息,您还可以查看类型比较表


0

0
不,它们并不相等。当变量未定义时,没有使用empty的表达式将生成有关未定义变量的通知。

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