4

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

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

4

3 回答 3

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
于 2013-10-02T22:37:36.137 回答
2

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

从有关抑制错误运算符的文档中:

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

在同一页面的一条评论中,有人写道:

我对 @ 符号的实际作用感到困惑,经过几次实验得出以下结论:

  • 设置的错误处理程序被调用,无论错误报告设置在什么级别,或者语句前面是否有 @

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

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

希望这可以帮助某人

if(@$x)简而言之,您可能看不到任何区别,但如果您使用代替issetempty ,那么在幕后会有一些额外的工作。那是因为错误处理程序总是被调用,即使你抑制错误。

于 2013-10-02T23:18:48.717 回答
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
于 2013-10-02T22:52:55.473 回答