这是一个好的做法还是使用PHP的错误抑制的可接受方式?
if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) {
echo 'hi';
}
if (@$_REQUEST['id'] == 6) {
echo 'hi';
}
编辑:
我也是这么想的。代码(和想法)来自朋友
谢谢你证明我是对的。 :)
答案 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秒这样做!这意味着你不应该首先这样做。
然而,@
对于比简单数组更复杂的事情来说是一种不好的做法,因此即使你知道性能差异微不足道,也不会使用它。