我看到很多人使用各种不同的方法来检查变量是否为空,确实似乎没有达成共识。我听说if($foo)
与if(!empty($foo))
或if($foo != "")
完全相同。 这是真的吗?
我意识到这是一个非常简单的问题,但我真的很想知道。有什么不同吗?我应该使用哪种方法?
答案 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
,
if(!empty($foo))
(恕我直言,简直太可怕)的不一致性的影响。if($foo != "")
,则不会生成E_NOTICE
,这是其优于$foo
的主要优势。这里有一个警告:如果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以找到此问题的答案。其中有一个列表,其值分别转换为true
和false
。
请注意,empty还会检查变量是否已设置,而常规比较则不会。未设置的变量将在比较期间触发类型E_NOTICE的错误,但在使用空时不会触发。您可以在比较前使用isset调用解决此问题,例如:
if(isset($foo) && $foo != '')
答案 3 :(得分:0)
if()
“转换”给bool的陈述,所以看看documentation for boolean似乎就是你要找的东西。总的来说:
""
),空数组(array()
),零(0
)和布尔值false(false
)被视为false
< / LI>
"foo"
,1
,array('foo')
,true
,...)被视为true
编辑:
有关详细信息,您还可以查看type comparison tables。
答案 4 :(得分:0)
empty($ foo)应该返回true:0,“”,NULL。
有关更完整的列表,请查看此页:http://php.net/manual/en/function.empty.php
答案 5 :(得分:0)
不,这不相等。如果未定义变量,则不带empty
的表达式将生成有关未定义变量的通知。