Isset ($ var) vs. @$var

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

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

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

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

Ответ 1

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

И еще одна вещь - "хорошая практика" закрывать круглые скобки при использовании isset():)

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Проверьте это с помощью эталона.

<?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

μs - миллионная доля секунды. Оба метода занимают около половины миллионной доли секунды.

Можно сказать, но что, если я сделаю это в течение сотен или тысяч раз, будет ли какая-то разница? Если вам нужно сделать !isset() миллион раз, то ваша программа уже потратила около 0,3 секунды на это! Это означает, что вы не должны были этого делать в первую очередь.

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