!empty($x) 和 @$x 之间有什么区别?

4

if(!empty($x))if(@$x) 有什么功能上的区别吗?

注意:我知道@可以抑制错误,我不会轻易使用它。


1
我从未见过 if(@$x) 这种用法。它常见吗? - TecBrat
2
我猜你在某处缺少了一个!。此外,请参阅type comparison tables - Gumbo
是的,我不确定,因为即使为空,空值也会在未设置时生成警告。 - rfoo
@Gumbo:看起来它们是完全相反的……我想这回答了问题。 - mpen
2
当我看到这个时,我的第一个想法是:这看起来不对。现在思考了5分钟,我仍然想不出为什么它会是错误的...有趣的问题马克。 - David Barker
显示剩余5条评论
3个回答

2
正如其他人指出的那样,使用if(@$x)可能没有功能上的区别,但这种写法似乎不太合适,而且有不使用它的理由。
抑制错误运算符的文档中可以看到:
如果您使用set_error_handler()设置了自定义错误处理函数,则仍将调用该函数,但是此自定义错误处理程序可以(也应该)调用error_reporting()。当触发错误的调用之前带有@时,error_reporting()将返回0。
同一页面的某个评论中,有人写道:
我对@符号的实际作用感到困惑,经过几次试验后得出以下结论:
  • 无论错误报告级别设置为何种水平,或者语句是否带有@,都会调用设置的错误处理程序。
  • 由错误处理器对不同的错误级别进行一些解释。您可以使自定义错误处理程序输出所有错误,即使错误报告被设置为NONE。
  • @运算符做了什么?它在该行中临时将错误报告级别设置为0。如果该行触发错误,错误处理程序仍将被调用,但将以0的错误级别调用。
希望这能帮助某些人。
简而言之,与使用issetempty相比,您使用if(@$x)可能看不到任何区别,但背后还有一些额外的工作。这是因为无论如何都会调用错误处理程序,即使您抑制了错误。

我认为这是一个功能上的差异,而且是一个非常重要的差异。感谢您提出这个问题! - mpen
一个很好的发现,我想象当不必要时调用错误处理程序多次会对堆栈产生相当大的影响。尤其是在使用Symfony或Laravel这样的框架时,与本地相比,错误处理程序并不特别轻巧。 - David Barker

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
好的,我知道你已经知道答案了,但为了完整起见 ;) - rfoo
我甚至尝试使用字面布尔值,但我仍然看不到!empty($x)和@$x之间的功能差异。 - rfoo

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接