2010-04-08 127 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秒這樣做!這意味着你首先不應該這樣做。

但是,@是任何東西比簡單數組更復雜的一種不好的做法,因此不使用它即使你知道性能差異不顯着。