這是一個好的做法或可接受的方式來使用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