Должен ли я использовать @ в моем коде PHP?
Если я использую @
в моем коде это повлияет на производительность?
6 ответов
Эта статья полезна для ответа на ваш вопрос: http://anvilstudios.co.za/blog/php/how-to-ignore-errors-in-a-custom-php-error-handler/
В частности, раздел "@ имеет свои применения":
Теперь действительно нужно использовать
@
оператор очень экономно, обрабатывая ошибки, а не подавляя их. Но есть небольшое количество ситуаций, которые я могу придумать, когда нужно подавить некоторые ошибки PHP. Позвольте мне привести два примера:
Вы могли бы использовать некоторую большую внешнюю библиотеку, которая использовала
@
и поэтому должны иметь возможность игнорировать эти ошибки, как задумал автор библиотеки, в противном случае ваша программа сработает там, где это не нужно. Вы можете редактировать библиотеку, но это может занять много времени, и ваши изменения снова придется применять каждый раз, когда автор выпускает обновление библиотеки.Другой пример может быть, когда
fopen
Функция используется для открытия внешнего URL, и URL не может быть открыт по одной из многих возможных причин. Функция возвращаетfalse
указывать на сбой, что замечательно, но процитировать руководство по PHP, "ошибка уровняE_WARNING
генерируется "тоже, не так здорово - это должно действительно привести к тому, что вместо этого будет выдано исключение, так как это нерегулярная ситуация, но следует ожидать. В этом случае хотелось бы иметь возможность игнорировать ошибку и продолжить с выполнением программы, явно отвечая соответствующим образом - именно для чего нужны исключения! Однако существует способ преобразовать ошибку в исключение, поэтому избегайте использования@
в этой ситуации. В вашем собственном обработчике ошибок (где мы находимся в этом посте), сгенерируйте ErrorException - тогда вам потребуется явно перехватить и обработать его в коде, который использовал@
раньше, что является лучшим способом обработки ошибок.
Вы не должны использовать оператор подавления ошибок.
В производственной среде сообщения об ошибках PHP не должны показываться пользователю. Они не полезны, потому что они полны технических деталей и не говорят пользователю, как действовать. Вместо этого зарегистрируйте ошибку и покажите собственное сообщение об ошибке.
В среде разработкивсе сообщения об ошибках PHP должны быть показаны пользователю. Они являются важной подсказкой относительно причины проблемы и должны быть замечены на ранней стадии.
Используйте параметры конфигурации ошибок и ведения журнала, чтобы различать эти два варианта. Производительность не является полезным критерием, чтобы решить, использовать ли @ или нет.
"Глупая последовательность - это хобгоблин маленьких умов".:) Сказать "никогда не пользуйся" - это немного любительская позиция, ИМО. Я предпочитаю, чтобы $var = @$_POST['key'], чем $var = isset($_POST['key'])? $_POST['key']: null;
@
сама по себе не является причиной проблем с производительностью (которые, между прочим, в профилирующих графах в основном незаметны). Отсутствие указателей массива и неопределенные переменные вызывают уведомления / предупреждения, и именно здесь происходит замедление. Сам оператор подавления ошибок не виноват.
С помощью @$var
вместо глупого isset($var)?$var:NULL
имеет преимущество в том, что все еще может регистрировать отладочные уведомления, где isset полностью их скрывает.
Да, это оказывает существенное влияние на производительность вашего скрипта.
Прочитайте статью Производительность подавления ошибок PHP.
Да, это снизит вашу производительность при поиске ошибок. Так что нет, вы не должны использовать его, если вы не уверены, что таким образом вы не вызовете больше проблем.