2010-04-08 90 views
10

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

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

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

编辑:
我也这样认为。代码(和想法)来自朋友。
谢谢你证明我的权利。 :)

+1

编辑:添加右括号给'isset()'调用。 – 2010-04-08 14:05:34

回答

12

使用错误抑制不是一个好习惯。甚至根本不使用$ _REQUEST。只需使用isset()或!empty()或其他,不要懒惰。

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

+1

你也可以使用'array_key_exists'来检查是否通过浏览器发送变量 – 2010-04-08 13:50:22

+0

是的,这就是为什么我添加了“或任何”:) – Kemo 2010-04-08 13:52:44

+1

我已经upvoted这,但为了完整性,你可以添加一些解释为OP的原因。 – Gordon 2010-04-08 14:26:47

2

我总是使用isset(),因为它更具体。此外,我会使用更具体的超全球变量,所以使用$ _POST,$ _GET,$ _SESSION。作为与您的代码清晰避免头痛以后:)

这是我跑我的检查:

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

这是相当彻底的检查,因为它检查后的所有脑干,则无论是我的变量是帖子的一部分,最后如果这两个通过,它会检查我的变量是否等于6.

+2

'$ _POST'的初始布尔检查是不必要的。此外,使用'isset'优先使用'array_key_exists',它的速度要快很多倍。唯一的好处是如果你想检查'id'是否存在但是为空。 – ryeguy 2010-04-08 14:04:18

+0

@ryeguy感谢您的建议! :)现在思考它是有点傻,因为array_key_exists遍历数组不是吗? – studioromeo 2010-04-08 14:18:43

+0

我最初也是这么想的,但事实并非如此。如果你测试'array_key_exists',你会发现它是'O(1)',就像'isset'一样。我认为'isset'更简单,因为它是一种语言结构,所以不会像'array_key_exists'这样的函数调用开销。 – ryeguy 2010-04-08 15:49:41

3

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

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

目前的“@”错误控制运算符前缀甚至禁用错误的,将终止脚本执行关键错误报告。除此之外,这意味着如果您使用“@”来抑制某个函数的错误,并且它不可用或错误输入,那么脚本就会在那里死去,而不会显示原因。

16

使用@来抑制错误只会抑制显示错误而不是创建。所以如果你不首先检查isset(),你会从错误中得到一个小的性能。

+0

这是最好的答案 – 2012-11-22 18:59:18

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 

微秒是百万分之一秒的。两种方法都接近百万分之一秒。

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

但是,@是任何东西比简单数组更复杂的一种不好的做法,因此不使用它即使你知道性能差异不显着。