if(!empty($x))
和if(@$x)
之间是否存在功能差异?
N.B。我知道@
可以抑制错误,我不会轻易使用它。
答案 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)
代替isset和empty,你可能看不到任何差异,但幕后有一些额外的工作。
这是因为即使您禁止错误,也会始终调用错误处理程序。
答案 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