2013-02-22 3 views
4

Дайте мне хотя бы одну причину, чтобы сделать это

if(isset($_GET['key']) && ($_GET['key'] === '123')) 
{... 

вместо этого

if(@$_GET['key'] === '123') 
{... 

Я прошу за это очень специфический код случае, а не вообще!

Эти причины не приветствуются: «использованием @ замедлит применение некоторых наносекунд, поскольку ошибка создается в любом случае (даже если это подавленное)»

  • Ну я предпочитаю медленный код но более читаемым.
  • «используя @ это плохая привычка.» Это может быть верно в целом, но я не верю в этом случае (кроме того, возможно, вредные привычки зависит от контекста, на PHP инструкции в функции как fopen они предложить использовать @ в некотором circumstainces см Ошибки/Исключение в http://www.php.net/manual/en/function.fopen.php)
+0

Так вы думаете, подавление ошибок делает код более читаемым?!? WTF! –

+1

Хотя вы можете это сделать, почему бы просто не определить глобальную функцию GET или что-то еще? –

+0

Восстанавливаемость. Обычная сортировка 'isset' сделает невозможным выяснить, была ли изменена переменная, всегда молча заменяя ее заменяющим значением. Подавление '@' является обратимым. Если вы абсолютно уверены, что вам не нужно отлаживать что-то позже, используйте 'isset'. Используйте '@', если входной параметр может иметь решающее значение/значение безопасности (а затем использовать обработчик ошибок ведения журнала). – mario

ответ

1

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

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

+0

Я согласен с этим, @ сделайте свой код намного медленнее. –

+1

«Использование @ замедляет приложение на некоторые наносекунды, потому что ошибка создается в любом случае (даже если она подавлена).« Ну, я предпочитаю более медленный код, но более читаемый ». – Nick

+0

Вы когда-нибудь делали какой-либо код? Возможно, вы используете только одинарные кавычки? – mario

4

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

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

if(@IsAvailable()) { 

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

+1

Да, я считаю, что это самая важная причина для этого. Скрытие ошибок позже в коде, о котором вы, возможно, захотите узнать. +1 –

0

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

Я согласен с вами в том, что preceed isset() перед чтением значения очень уродлив, и я тоже не хочу его писать. Но вставить @ перед заявлением кажется уродливым. Это может уменьшить читаемость в более длинном коде.

Хорошая новость заключается в том, что с PHP 7 мы можем использовать гораздо лучший способ, оператор с нулевой связью ??, который работает следующим образом:

if($_GET['key'] ?? '' === '123') {} 

Это в основном замена для этого:

$result = isset($value) ? $value : $anotherValue; 

теперь вы можете использовать

$result = $value ?? $anotherValue;