繁体   English   中英

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

[英]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)) ,它与上面的完全相同:

  1. 它不会受到if($foo != "") (IMHO简直太可怕)的不一致性的影响。
  2. 如果当前作用域中不存在$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 {...}

您可以阅读有关转换为布尔值文档以查找此问题的答案。 其中有一个列表,其值分别转换为truefalse

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

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

if() “转换”给bool的语句,所以看一下boolean文档似乎就是你要找的东西。 一般来说:

  • 空字符串( "" ),空数组( array() ),零( 0 )和布尔值false( false )被视为false
  • 其他一切( "foo"1array('foo')true ,...)被视为true

编辑:
有关更多信息,您还可以检查类型比较表

empty($ foo)应该在所有这些情况下返回true:0,“”,NULL。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM