!empty($ x)和@ $ x之间的区别?

时间:2013-10-02 22:23:43

标签: php

if(!empty($x))if(@$x)之间是否存在功能差异?

N.B。我知道@可以抑制错误,我不会轻易使用它。

3 个答案:

答案 0 :(得分:2)

我进行了一系列测试,并带回了这些结果。

When $x="foo";

@$x == true
!empty($x) == true
isset($x) == true

When $x has not been set!

@$x == false
!empty($x) == false
isset($x) == false

这是另一个具有不同x值的集合。

When $x=0;

@$x == false
!empty($x) == false
isset($x) == true

再次使用1。

When $x=1;

@$x == true
!empty($x) == true
isset($x) == true

答案 1 :(得分:2)

可能没有其他人指出的功能差异,但使用if(@$x)似乎不正确,并且有理由不使用它。

有关suppression error operator的文档:

  

如果您使用set_error_handler()设置了自定义错误处理函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(并且应该)调用error_reporting(),当触发错误的调用在此之前返回0通过@。

在同一页的一篇评论中有人写道:

  

我对@符号实际上做了什么很困惑,经过一些实验得出以下结论:

     
      
  • 调用设置的错误处理程序,无论设置错误报告的级别如何,或者语句是否已启用   与@

  •   
  • 由错误处理程序决定在不同的错误级别上赋予一些含义。您可以使自定义错误处理程序回显   所有错误,即使错误报告设置为NONE。

  •   
  • 那么@运营商会做什么?它会临时将该行的错误报告级别设置为0。如果该行触发错误,   错误处理程序仍将被调用,但它将被调用   错误级别为0

  •   
     

希望这有助于某人

简而言之,如果你使用if(@$x)代替issetempty,你可能看不到任何差异,但幕后有一些额外的工作。 这是因为即使您禁止错误,也会始终调用错误处理程序。

答案 2 :(得分:1)

对此非常好奇,我运行的一些测试的结果显示没有任何偏差。

格式测试:

var_dump(!empty($x));
var_dump(!!@$x);

结果

$x is an empty array
boolean false
boolean false

$x is int(1)
boolean true
boolean true

$x is int(0)
boolean false
boolean false

$x is float(0.1)
boolean true
boolean true

$x is string(0)
boolean false
boolean false

$x is string(1)
boolean true
boolean true

$x is string(abc)
boolean true
boolean true

$x is instance of stdClass
boolean true
boolean true

$x is true
boolean true
boolean true

$x is false
boolean false
boolean false

$x is defined null
boolean false
boolean false

$x is not set
boolean false
boolean false