这是一个好的做法或可接受的方式来使用PHP的错误抑制?
if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) {
echo 'hi';
}
if (@$_REQUEST['id'] == 6) {
echo 'hi';
}
编辑:
我也这样认为。代码(和想法)来自朋友。
谢谢你证明我的权利。 :)
这是一个好的做法或可接受的方式来使用PHP的错误抑制?
if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) {
echo 'hi';
}
if (@$_REQUEST['id'] == 6) {
echo 'hi';
}
编辑:
我也这样认为。代码(和想法)来自朋友。
谢谢你证明我的权利。 :)
我总是使用isset(),因为它更具体。此外,我会使用更具体的超全球变量,所以使用$ _POST,$ _GET,$ _SESSION。作为与您的代码清晰避免头痛以后:)
这是我跑我的检查:
if(isset($_POST['id']) && $_POST['id'] == '6')
{
// do stuff
}
这是相当彻底的检查,因为它检查后的所有脑干,则无论是我的变量是帖子的一部分,最后如果这两个通过,它会检查我的变量是否等于6.
'$ _POST'的初始布尔检查是不必要的。此外,使用'isset'优先使用'array_key_exists',它的速度要快很多倍。唯一的好处是如果你想检查'id'是否存在但是为空。 – ryeguy 2010-04-08 14:04:18
@ryeguy感谢您的建议! :)现在思考它是有点傻,因为array_key_exists遍历数组不是吗? – studioromeo 2010-04-08 14:18:43
我最初也是这么想的,但事实并非如此。如果你测试'array_key_exists',你会发现它是'O(1)',就像'isset'一样。我认为'isset'更简单,因为它是一种语言结构,所以不会像'array_key_exists'这样的函数调用开销。 – ryeguy 2010-04-08 15:49:41
不,这不是真的在我看来,一个可以接受的做法。除了看起来马虎的事实之外,即使使用错误抑制,自定义错误处理程序仍然会被触发。
的manual提供了更多的理由来避免它完全使用:
目前的“@”错误控制运算符前缀甚至禁用错误的,将终止脚本执行关键错误报告。除此之外,这意味着如果您使用“@”来抑制某个函数的错误,并且它不可用或错误输入,那么脚本就会在那里死去,而不会显示原因。
使用@来抑制错误只会抑制显示错误而不是创建。所以如果你不首先检查isset(),你会从错误中得到一个小的性能。
这是最好的答案 – 2012-11-22 18:59:18
除了不是一个好的做法,因为@
可以咀嚼调用堆栈中真正重要的错误,性能损失很小。
让我们用基准来验证。
<?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
微秒是百万分之一秒的。两种方法都接近百万分之一秒。
有人会说,但如果我这样做几百或几千次,会有什么区别吗?如果你必须做!isset()
一百万次,那么你的程序已经花了大约0.3秒这样做!这意味着你首先不应该这样做。
但是,@
是任何东西比简单数组更复杂的一种不好的做法,因此不使用它即使你知道性能差异不显着。
编辑:添加右括号给'isset()'调用。 – 2010-04-08 14:05:34