我看到很多人使用各种不同的方法来检查变量是否为空,似乎没有共识。我听说if($foo)
和if(!empty($foo))
或if($foo != "")
是完全相同的。这是真的吗?
我知道这是一个非常简单的问题,但我真的想知道。有什么区别吗?我应该使用哪种方法?
我看到很多人使用各种不同的方法来检查变量是否为空,似乎没有共识。我听说if($foo)
和if(!empty($foo))
或if($foo != "")
是完全相同的。这是真的吗?
我知道这是一个非常简单的问题,但我真的想知道。有什么区别吗?我应该使用哪种方法?
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))
,它与上述方法不完全相同,因为:
if($foo != "")
存在不一致性(在我看来非常糟糕),而empty($foo)
则没有这个问题。$foo
在当前作用域中不存在,empty($foo)
不会生成E_NOTICE
警告,这是它比if($foo)
更大的优点。但需要注意的是:如果$foo === '0'
(长度为1的字符串),empty($foo)
将返回true
,这通常是(但可能不总是)您想要的结果。然而,if($foo)
也会有同样的情况。
最后,在特定类型的值上进行测试时,必须对上述规则做出例外。例如,strpos
可能返回0
,也可能返回false
,但这两个值的含义完全不同。在这种情况下,应该使用全等运算符进行测试:if(strpos() === false)
。
empty()
现在可以用于任意表达式。请参见:http://php.net/manual/en/migration55.new-features.php#migration55.new-features.empty。因此,`echo empty(array());将输出
1`。 - Will B.if($foo)
时,PHP会将变量转换为布尔类型。空字符串、零整数或空数组将被视为false
。有时这可能会成为问题。if($foo==='')
(注意三个等号)。如果你希望使用(布尔)false或资源(例如来自数据库查询的资源),请使用if($foo===false){...} else {...}
。您可以阅读关于转换为布尔值的文档来找到这个问题的答案。其中有一个列表,列出了哪些值分别被转换为true
和false
。
请注意,empty还检查变量是否设置,而常规比较则不会。未设置的变量在比较过程中会触发E_NOTICE类型的错误,但使用empty时不会。您可以在比较之前使用isset调用来解决此问题,像这样:
if(isset($foo) && $foo != '')
if()
如何工作了。我想在需要的情况下只需使用if(!empty($foo))
,这样就不会产生E_NOTICE了。 - Avicinnian在所有这些情况下,empty($foo)应该返回true:0,“”,NULL。
有关更完整的列表,请查看此页面:http://php.net/manual/en/function.empty.php
empty
的表达式将生成有关未定义变量的通知。
if($foo != "")
的替代方案*确实使它与简单的“if vs empty”问题不同 - 请参见我的答案以获取证明。 - Jon