2010-04-08 5 views
10

Является ли это хорошей практикой или приемлемым способом использования подавления ошибок PHP?

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

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

EDIT:
Я тоже так думал. Код (и идея) от друга.
Спасибо, что доказали, что я прав. :)

+1

EDIT: Добавлена ​​закрывающая скобка для вызова 'isset()'. –

ответ

12

Это не очень хорошая практика для использования подавления ошибок. Совсем не рекомендуется использовать $ _REQUEST. Просто используйте isset() или! Empty() или что-то еще, не ленитесь.

И еще одна вещь, это «хорошая практика», чтобы закрыть скобки при использовании Исеть() :)

+1

Вы также можете использовать 'array_key_exists', чтобы проверить, не пересылается ли переменная браузером –

+0

да, поэтому я добавил« или что-то еще »:) – Kemo

+1

Я поддержал это, но для полноты вы могли бы добавить некоторое объяснение OP о причинах. – Gordon

2

Я всегда использую isset(), поскольку это более конкретно. Кроме того, я бы использовал более конкретную супергрупповую переменную, поэтому используйте либо $ _POST, $ _GET, $ _SESSION. Четкое с кодом позволяет избежать головной боли позже :)

Это как я запускаю проверки:

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

Это очень тщательная проверка, так как он проверяет наличие существования поста, то ли мой переменной является частью сообщения, и, наконец, если эти два проходят, он проверяет, равна ли моя переменная 6.

+2

Исходная логическая проверка для '$ _POST' не нужна. Кроме того, использование 'isset' предпочтительнее использования' array_key_exists', это во много раз быстрее. Единственное преимущество - проверить, существует ли 'id', но имеет значение NULL. – ryeguy

+0

@ryeguy Спасибо за совет! :) думая об этом сейчас, да, это немного глупо, так как array_key_exists итерации по массиву не так ли? – studioromeo

+0

Я тоже думал об этом, но это неправда. Если вы сравниваете «array_key_exists», вы поймете, что это «O (1)», как «isset». Я думаю, что 'isset' быстрее, потому что это языковая конструкция, поэтому накладные расходы на функциональные вызовы отсутствуют, например, для' array_key_exists'. – ryeguy

3

Нет, это не совсем приемлемая практика, на мой взгляд. Помимо того, что он выглядит неаккуратно, пользовательские обработчики ошибок все еще запускаются даже при использовании подавления ошибок.

manual предлагает больше причин, чтобы избежать его использования в целом:

В настоящее время «@» ошибка управление Приставка оператор будет даже отключить отчеты об ошибках для критических ошибок, которые оканчиваются выполнение скрипта. Между прочим, это означает, что если вы используете «@» для подавления ошибок от определенной функции, и либо она недоступна, либо была опечатана, скрипт будет умирать прямо там без указания относительно причины.

16

Подавление ошибок с помощью @ только подавляет отображение ошибки, а не создание. Таким образом, вы получаете небольшой выигрыш от ошибки, если вы сначала не проверите isset().

+0

Это лучший правильный ответ –

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 секунды, делая это! Это означает, что вы не должны были этого делать в первую очередь.

Тем не менее, @ - это плохая практика для чего-либо более сложного, чем простой массив, поэтому не использовать его, даже если вы знаете, что разница в производительности незначительна.