Если я использую @
в моем коде, это повлияет на производительность?Должен ли я использовать @ в своем PHP-коде?
ответ
Эта статья полезна для ответа на ваш вопрос: 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 - это потребует, чтобы явным образом поймал и обработал в коде, который раньше использовался@
, что является лучшим способом Обработка ошибок.
Из двух описанных там ситуаций первая имеет некоторые достоинства. Вы застряли в плохо написанной библиотеке, вам нужно иметь дело с ней. Второй, однако, может быть решен более изящным образом, используя специальный обработчик ошибок, чтобы выбросить 'ErrorException', а затем обработать их. http://www.php.net/manual/en/class.errorexception.php – Mchl
Я второй ответ, тем более, что написал [Как игнорировать ошибки @ в пользовательском обработчике ошибок PHP] (http: // anvilstudios. article /. =) @ Замечание Mchl действительно, и это именно то, что мы делаем в нашей пользовательской структуре. Я обновил статью, чтобы отразить это, спасибо. – Abraham
Да, это уменьшит производительность при охоте на ошибки. Так что нет, вы не должны использовать его, если не уверены, что не станете больше беспокоиться об этом.
Да, это влияет на производительность вашего скрипта значительным образом.
Читать статью PHP Error Suppression Performance.
Я не читал этого в статье. Ошибки - проблема производительности. – grantwparks
Сам по себе @
не является причиной проблем с производительностью (что, кстати, в большинстве случаев незаметно для профилирующих графиков). Отсутствующие индексы массивов и неопределенные переменные вызывают уведомления/предупреждения, и здесь наблюдается замедление. Сам оператор подавления ошибок не виноват.
Использование @$var
вместо fugly isset($var)?$var:NULL
имеет то преимущество, что все еще можно записывать отладочные уведомления, где isset полностью скрывает их.
На самом деле, какой оператор suppresion ошибки делает это намного больше. Он хранит текущий уровень отчетности об ошибках, переключает отчет об ошибках на 0, выполняет оператор, стоящий перед и, наконец, восстанавливает предыдущий уровень отчетности об ошибках. Довольно много, я бы сказал. – Mchl
@Mchl: Довольно много, все еще весьма незначительно. Это тема микро оптимизации. Eschewing @ так же чувствителен, как использование одинарных кавычек (если в вашем приложении, конечно, нет миллиарда строк или источников ошибок). – mario
Суть заключается не в том, чтобы эти источники ошибок были в первую очередь, так что вам не нужно их подавлять;) – Mchl
Вы не должны использовать оператор подавления ошибок.
В производственной среде no PHP-сообщения об ошибках должны отображаться пользователю. Они не полезны, потому что они полны технических подробностей и не говорят пользователю, как действовать. Вместо этого запишите ошибку и покажите свое собственное сообщение об ошибке.
В среде разработки все Сообщения об ошибках PHP должны отображаться пользователю. Они являются жизненно важным ключом к проблеме проблемы и должны быть замечены на ранней стадии.
Используйте Errors and Logging Configuration Options, чтобы различать тезисы двух. Производительность не является полезным критерием для принятия решения о том, следует ли использовать @ или нет.
«Глупая консистенция - это хобгоблин маленьких умов». :) Чтобы сказать, что «никогда не использовать его», это немного любительская позиция, ИМО. Я предпочитаю $ var = @ $ _ POST ['key'] $ var = isset ($ _ POST ['key'])? $ _POST ['key']: null;
- 1. Должен ли я использовать функцию или параметр в своем отчете?
- 2. Должен ли я использовать базу данных на своем веб-сайте?
- 3. Почему я должен использовать XFN в своем HTML?
- 4. Должен ли я использовать jQuery.each()?
- 5. Когда я должен использовать компонент SQLite в своем приложении Xamarin?
- 6. Почему я должен использовать кеширование в своем коде?
- 7. Какой тип клика я должен использовать в своем веб-приложении?
- 8. Когда я должен использовать Java в своем приложении ColdFusion?
- 9. Какое условие цикла я должен использовать в своем задании?
- 10. Когда я должен использовать профили в своем веб-приложении?
- 11. Почему я должен использовать PDO в своем приложении?
- 12. Когда я должен использовать несколько контроллеров в своем приложении?
- 13. Какую структуру я должен использовать в своем гибридном приложении?
- 14. Должен ли я хранить много версий jQuery в своем приложении?
- 15. Должен ли я создавать явные свойства DbSet в своем DbContext?
- 16. Должен ли я использовать File.write?
- 17. Должен ли я использовать MongoDB?
- 18. Должен ли я использовать TDD?
- 19. Должен ли я использовать Subversion?
- 20. Должен ли я использовать Table.cells []?
- 21. Должен ли я использовать сеансы?
- 22. Должен ли я использовать wakelock?
- 23. Должен ли я использовать prefixfree.js?
- 24. Должен ли я использовать ExecutorService?
- 25. Должен ли я использовать синглтон?
- 26. Должен ли я использовать dequeReusableCellWithIdentifier?
- 27. Должен ли я использовать ProGuard?
- 28. Должен ли я использовать singleletableview?
- 29. Должен ли я использовать Zend_Form?
- 30. Должен ли я использовать многопоточность
Я никогда не сталкивался с ситуацией, когда мне абсолютно нужно было ее использовать. У вас есть? – Mchl
Возможный дубликат [Ссылка - что означает этот символ в PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) - все вопросы, касающиеся оператор подавления ошибок, связанный в ссылке, скажет вам, что вы не должны его использовать. В комментариях на странице руководства есть некоторые комментарии, касающиеся производительности. – Gordon