Что означает символ «@» в следующем коде?
@mkdir(ROOT. "cache/");
Он подавляет ошибки при отображении :
PHP поддерживает один оператор управления ошибкой: знак at (@). При добавлении выражения в PHP любые сообщения об ошибках, которые могут быть сгенерированы этим выражением, будут игнорироваться.
Если функция track_errors включена, любое сообщение об ошибке, сгенерированное выражением, будет сохранено в переменной $ php_errormsg. Эта переменная будет перезаписана при каждой ошибке, поэтому сначала проверьте, хотите ли вы ее использовать.
Как отмечалось в комментариях, я тоже не могу представить себе причину, чтобы фактически использовать эту функциональность – написать код, который соответствующим образом соответствует состояниям / состояниям ошибок.
Как указывалось, это оператор подавления ошибок.
Но то, о чем не было указано, заключается в том, что использовать эту очень плохую практику – ошибки не должны терпеть неудачу молча.
Проверьте наличие ошибок и используйте блоки try / catch, в которых используются исключения.
В конкретном примере …
@mkdir(ROOT. "cache/");
… он игнорирует любые ошибки из mkdir()
. Документы говорят, что он возвращает FALSE
при сбое, поэтому вы должны делать …
if ( ! mkdir(ROOT. "cache/")) { // Handle error. }
Люди, похоже, забывают, что PHP был быстрым грязным языком для достижения поставленных целей, только недавно он пытался стать зрелым и изощренным.
Подавление ошибок – быстрый и грязный способ заставить функции вести себя так, как вам нужно, потому что в веб-разработке вы не можете предсказать, что будет брошено вам, а иногда это не стоит заботиться!
Классическим примером является полезная функция getimagesize, которая позволяет вам получить некоторую информацию об изображении, которое кто-то загрузил. Эта функция замаскирует шаткий, если файл изображения не является стандартным файлом изображения. На самом деле роль разработчиков не проверять файл, определить, может ли он быть загружен в getimagesize. Там могут быть элегантные способы сделать это, но серьезно мне все равно!
просто сделайте это:
if( !($a = @getimagesize( $_FILE['file']['tmp_name'] ))) { unlink( $_FILE['file']['tmp_name'] ); //politely tell user that you rejected their image! }
да, вы можете использовать утверждения try и catch, которые более изящны, но в конце концов вы поймали ошибку и подавили сообщение об ошибке, которое вы хотели, не используя табуляцию!
Вопреки тому, что сказано выше, префикс @, используемый тщательно, не приводит к развалу крушения поезда. Это позволяет разработчику допускать ошибки в том виде, в котором они предпочитают.