if($ val)vs if($ val!=“”)vs。if(!empty($ val)) - 哪一个?

时间:2011-09-12 08:05:14

标签: php if-statement

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

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

6 个答案:

答案 0 :(得分:20)

裸测试与空字符串

的比较

if($foo != "")大部分时间相当于if($foo) ,但并非总是

要查看差异的位置,请考虑comparison operator behavior以及第一个案例的conversion to string rules和第二个案例的conversion to boolean rules

我发现的是:

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

<强> See the differences in action

更好的测试方法

首选测试方法false

  1. 它不会受到if(!empty($foo))(恕我直言,简直太可怕)的不一致性的影响。
  2. 如果当前范围中不存在if($foo != ""),则不会生成E_NOTICE,这是其优于$foo的主要优势。
  3. 这里有一个警告:如果if($foo)(一个长度为1的字符串),那么$foo === '0'将返回empty($foo),这通常是(但可能不会始终 be)你想要什么。 true也是如此。

    有时您需要使用相同的运算符

    进行测试

    最后,当您要测试特定类型的值时,必须对上述内容进行例外处理。例如,if($foo)可能会返回strpos,也可能会返回0。这两个值都不会通过false测试,但它们的含义完全不同。在这些情况下,identical operator的测试顺序为:if(strpos(...))

答案 1 :(得分:5)

不,并非总是如此。当你执行if($foo) PHP时,将变量转换为布尔值。那么空字符串,零整数或空数组将是false。有时这可能是一个问题。

如果你期望一个可以为空的字符串使用if($foo==='')(注意三个等号),你应该总是尝试使用最具体的比较。如果您希望(布尔值)为false或资源(例如,来自数据库查询),请使用if($foo===false){...} else {...}

答案 2 :(得分:0)

您可以阅读documentation about casting to boolean以找到此问题的答案。其中有一个列表,其值分别转换为truefalse

请注意,empty还会检查变量是否已设置,而常规比较则不会。未设置的变量将在比较期间触发类型E_NOTICE的错误,但在使用空时不会触发。您可以在比较前使用isset调用解决此问题,例如:

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

答案 3 :(得分:0)

if()“转换”给bool的陈述,所以看看documentation for boolean似乎就是你要找的东西。总的来说:

  • 空字符串(""),空数组(array()),零(0)和布尔值false(false)被视为false < / LI>
  • 其他所有内容("foo"1array('foo')true,...)被视为true

编辑:
有关详细信息,您还可以查看type comparison tables

答案 4 :(得分:0)

在所有这些情况下,

empty($ foo)应该返回true:0,“”,NULL。

有关更完整的列表,请查看此页:http://php.net/manual/en/function.empty.php

答案 5 :(得分:0)

不,这不相等。如果未定义变量,则不带empty的表达式将生成有关未定义变量的通知。