![](/img/trans.png)
[英]PHP: if (!$val) VS if (empty($val)). Is there any difference?
[英]if($val) vs. if($val != “”) vs. if(!empty($val)) — which one?
我看到很多人使用各种不同的方法来检查变量是否为空,确实似乎没有达成共识。 我听说if($foo)
与if(!empty($foo))
或if($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 != "")
(IMHO简直太可怕)的不一致性的影响。 $foo
,则不会生成E_NOTICE
,这是其优于if($foo)
主要优势。 这里有一个警告:如果$foo === '0'
(一个长度为1的字符串),那么empty($foo)
将返回true
,这通常是(但可能并不总是 )你想要的。 这也是if($foo)
的情况。
最后,当您要测试特定类型的值时,必须对上述内容进行例外处理。 例如, strpos
可能返回0
并且也可能返回false
。 这两个值都将失败if(strpos(...))
测试,但它们具有完全不同的含义。 在这些情况下,使用相同运算符的测试依次为: if(strpos() === false)
。
不,并非总是如此。 当你执行if($foo)
PHP将变量转换为Boolean。 空字符串,零整数或空数组将为false
。 有时这可能是一个问题。
你应该总是尽量使用最具体的比较,如果你期望一个字符串可以是空的使用if($foo==='')
(注意三个等号)。 如果您期望(布尔值)false或资源(例如来自数据库查询),请使用if($foo===false){...} else {...}
empty($ foo)应该在所有这些情况下返回true:0,“”,NULL。
有关更完整的列表,请查看此页面: http : //php.net/manual/en/function.empty.php
不,这不相等。 如果未定义变量,则不带empty
表达式将生成有关未定义变量的通知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.