if(!empty($ thing))vs if($ thing)

时间:2012-11-21 16:50:57

标签: php conditional-statements

这两个语句是否完全相同,给定$thing可以是任何类型的?

if (!empty($thing)) {
    // do stuff
}

if ($thing) {
    // do stuff
}

我知道我可以尝试一下,但我不确定我是否能抓住所有边缘情况......我担心在某些情况下他们会执行相同的操作,但是不是全部。

5 个答案:

答案 0 :(得分:4)

如果$thing未定义,则if ($thing)会抛出(非致命)错误,而if (!empty($thing))将返回false。

请参阅PHP文档中的empty()

答案 1 :(得分:2)

if (empty($foo))if ($foo)的否定,可以很容易地在type comparison tables中看到,这意味着在最低级别:

if (!empty($foo))

在逻辑上与

相同
if ($foo)

然而,对于未定义的变量或数组索引,if ($foo)if ($foo['bar'])会导致E_WARNING发生,而if (!empty($foo))和{ {1}}

为此,如果变量或索引可能不存在,您应该更喜欢if (!empty($foo['bar']))empty,例如使用!empty$_GET。如果变量或索引应该存在,您应该特别选择$_POST$var,以便跟踪抛出的警告,因为它们可能是由于错误造成的。 / p>

答案 2 :(得分:2)

相关的手册页为Converting to boolean,当然还有empty()。对于empty(),我们有:

  

如果变量不存在或者其值等于FALSE

,则该变量被视为空

因此,除非在变量不存在的情况下,它们完全等效。在那种情况下:

var_dump( empty($not_exists), (bool)$not_exists );

......我们得到:

bool(true)
bool(false)

...(在相应的notice中)因为:

  

以下值被视为FALSE:[...]未设置变量

答案 3 :(得分:0)

根据手册有一些差异,例如:

$object = new stdclass;
if ($object) {} // false in PHP 4, true in PHP 5+

此外,您只能将变量传递给empty,这会引发错误:

if (empty(time()) {}
// Fatal error: Can't use function return value in write context

if (time()) {} // OK

当然,对未初始化的变量if ($var)会产生通知。

if ($var)是一个隐式的布尔转换。有关详细信息,请参阅手册。

  

http://php.net/manual/en/language.types.boolean.php

     

转换为布尔值时,以下值被视为FALSE:

     
      
  • 布尔值FALSE本身
  •   
  • 整数0(零)
  •   
  • 浮点数0.0(零)
  •   
  • 空字符串,字符串“0”
  •   
  • 包含零元素的数组
  •   
  • 一个零成员变量的对象(仅限PHP 4)
  •   
  • 特殊类型NULL(包括未设置的变量)
  •   
  • 从空标签创建的SimpleXML对象
  •   
     

其他每个值都被视为TRUE(包括任何资源)。

empty

比较
  

http://php.net/manual/en/function.empty.php

     

以下内容被认为是空的:

     
      
  • “”(空字符串)
  •   
  • 0(0为整数)
  •   
  • 0.0(0作为浮动)
  •   
  • “0”(0作为字符串)
  •   
  • NULL
  •   
  • FALSE
  •   
  • array()(空数组)
  •   
  • $变种; (声明的变量,但没有值)
  •   

所以它们基本相同,但有一些非常微妙的差异。请谨慎使用,并在可能的情况下进行类型检查。

答案 4 :(得分:0)

在某些情况下,空的可能会爆炸,其中最大的是0

php > $x = 0;
php > var_dump(empty($x));
bool(true)
php > $x = false;
php > var_dump(empty($x));
bool(true);

只要你不要求0 / false值通过,那么empty()效果很好。