isset($ var)与@ $ var

时间:2010-04-08 13:44:00

标签: php error-handling

这是一个好的做法还是使用PHP的错误抑制的可接受方式?

if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) {
  echo 'hi';
}

if (@$_REQUEST['id'] == 6) {
  echo 'hi';
}

编辑:
我也是这么想的。代码(和想法)来自朋友 谢谢你证明我是对的。 :)

5 个答案:

答案 0 :(得分:16)

使用@来抑制错误只会抑制错误的显示,而不是创建。因此,如果您不首先检查isset(),则会从错误中获得较小的性能。

答案 1 :(得分:12)

使用错误抑制并不是一个很好的做法。根本不使用$ _REQUEST是一个好习惯。只需使用isset()或!empty()或其他什么,不要偷懒。

还有一件事,在使用isset()时关闭括号是一个“好习惯”:)

答案 2 :(得分:3)

不,在我看来,这不是一个真正可以接受的做法。除了看起来很草率之外,即使使用错误抑制,自定义错误处理程序仍然会被触发。

manual提供了更多理由避免完全使用它:

  

目前,“@”错误控制操作符前缀甚至会禁用错误报告,以解决将终止脚本执行的严重错误。除此之外,这意味着如果你使用“@”来抑制来自某个函数的错误,并且它不可用或者输入错误,那么脚本就会在那里死亡而没有任何关于原因的指示。

答案 3 :(得分:2)

我总是使用isset(),因为它更具体。另外,我使用更具体的超全局变量,所以使用$ _POST,$ _GET,$ _SESSION。明确你的代码可以避免以后的麻烦:)

这是我运行支票的方式:

if(isset($_POST['id']) && $_POST['id'] == '6')
{
     // do stuff
}

这是非常彻底的检查,因为它检查一个帖子的存在,然后我的变量是否是帖子的一部分,最后如果这两个通过,它会检查我的变量是否等于6。

答案 4 :(得分:1)

除了不是一个好的做法,因为@可以在调用堆栈中咀嚼真正重要的错误,性能损失是微不足道的。

让我们用基准来验证这一点。

<?php
error_reporting(-1);

$limit = 10000;

$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    echo !isset($_GET['aaa']) ? '' : $_GET['aaa'];
}
$total = 1000000 * (microtime(true) - $start)/$limit;
echo "With isset: $total μs\n";

$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    echo @$_GET['aaa'];
}
$total = 1000000 * (microtime(true) - $start)/$limit;
echo "With @: $total μs\n";

在我不太新的计算机上输出:

With isset: 0.295 μs
With @: 0.657 μs

μs是百万分之一秒。这两种方法都接近百万分之一秒。

有人可以说,但如果我这样做数百或数千次,会有什么不同吗?如果你必须做!isset()一百万次,那么你的程序已经花了大约0.3秒这样做!这意味着你不应该首先这样做。

然而,@对于比简单数组更复杂的事情来说是一种不好的做法,因此即使你知道性能差异微不足道,也不会使用它