Является ли это хорошей практикой или приемлемым способом использования подавления ошибок PHP?
if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) { echo 'hi'; } if (@$_REQUEST['id'] == 6) { echo 'hi'; }
РЕДАКТИРОВАТЬ:
Я тоже так думал. Код (и идея) от друга.
Спасибо, что доказываю, что я прав. 🙂
Это не очень хорошая практика, чтобы использовать подавление ошибок. Совсем не рекомендуется использовать $ _REQUEST. Просто используйте isset () или! Empty () или что-то еще, не ленитесь.
И еще одна вещь – «хорошая практика» закрывать круглые скобки при использовании isset () 🙂
Подавление ошибок с помощью @ только подавляет отображение ошибки, а не создание. Таким образом, вы получаете небольшой выигрыш от ошибки, если вы сначала не проверите isset ().
Нет, на мой взгляд, это не приемлемая практика. Помимо того, что он выглядит неаккуратно, пользовательские обработчики ошибок все еще запускаются даже при использовании подавления ошибок.
В руководстве содержится больше причин, чтобы избежать его использования в целом:
В настоящее время префикс оператора ошибки «@» даже отключает отчет об ошибках для критических ошибок, которые прекратят выполнение скриптов. Между прочим, это означает, что если вы используете «@» для подавления ошибок от определенной функции, и либо она недоступна, либо была опечатана, скрипт будет умирать прямо там без указания относительно причины.
Я всегда использую isset (), поскольку он более конкретный. Кроме того, я бы использовал более конкретную супергрупповую переменную, поэтому используйте либо $ _POST, $ _GET, $ _SESSION. Быть ясным с вашим кодом избегает головных болей позже 🙂
Вот как я запускаю свои проверки:
if(isset($_POST['id']) && $_POST['id'] == '6') { // do stuff }
Это довольно тщательная проверка, так как она проверяет наличие сообщения, то есть ли моя переменная является частью сообщения, и, наконец, если эти два передают, он проверяет, равна ли моя переменная 6.
Помимо того, что это не очень хорошая практика, поскольку @
может пережевывать действительно важные ошибки в стеке вызовов, штраф за исполнение является незначительным.
Давайте проверим это с помощью теста.
<?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 секунды на это! Это означает, что вы не должны были этого делать в первую очередь.
Тем не менее, @
– это плохая практика для чего-то более сложного, чем простой массив, поэтому не используйте его, даже если вы знаете, что разница в производительности незначительна.