if(!empty($x))
和之间有什么功能上的区别if(@$x)
吗?
注意我知道它会@
抑制错误,我不会轻易使用它。
我进行了一系列测试并得到了这些结果。
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
正如其他人所指出的那样,可能没有功能差异,但使用if(@$x)
似乎并不正确,并且有理由不使用它。
从有关抑制错误运算符的文档中:
如果您使用 set_error_handler() 设置了自定义错误处理函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(并且应该)调用 error_reporting() 当触发错误的调用前面有 @ 时,它将返回 0 .
在同一页面的一条评论中,有人写道:
我对 @ 符号的实际作用感到困惑,经过几次实验得出以下结论:
设置的错误处理程序被调用,无论错误报告设置在什么级别,或者语句前面是否有 @
由错误处理程序来赋予不同错误级别的某些含义。即使错误报告设置为 NONE,您也可以让自定义错误处理程序回显所有错误。
那么@运算符是做什么的呢?它暂时将该行的错误报告级别设置为 0。如果该行触发错误,错误处理程序仍将被调用,但会以错误级别 0 调用
希望这可以帮助某人
if(@$x)
简而言之,您可能看不到任何区别,但如果您使用代替isset和empty ,那么在幕后会有一些额外的工作。那是因为错误处理程序总是被调用,即使你抑制错误。
对此非常好奇,我运行的一些测试结果完全没有偏差。
测试格式:
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