Подтвердить что ты не робот

Что делает префикс '@' в PHP?

Что означает символ "@" в следующем коде?

@mkdir(ROOT. "cache/");
4b9b3361

Ответ 1

Он подавляет ошибки при отображении:

PHP поддерживает один оператор управления ошибкой: знак at (@). При добавлении выражения в PHP любые сообщения об ошибках, которые могут быть сгенерированы этим выражением, будут игнорироваться.

Если функция track_errors включена, любое сообщение об ошибке, сгенерированное выражением, будет сохранено в переменной $php_errormsg. Эта переменная будет перезаписана при каждой ошибке, поэтому сначала проверьте, хотите ли вы ее использовать.

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

Ответ 2

Как указано, это оператор подавления ошибок.

Но то, о чем не было указано, заключается в том, что использовать очень плохую практику - ошибки не должны терпеть неудачу.

Проверьте наличие ошибок и используйте блоки try/catch, в которых используются исключения.

В конкретном примере...

@mkdir(ROOT. "cache/");

... он игнорирует любые ошибки из mkdir(). docs говорит, что он возвращает FALSE при сбое, поэтому вы должны делать...

if ( ! mkdir(ROOT. "cache/")) {
   // Handle error.
}

Ответ 3

Люди, похоже, забывают, что 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, которые более изящны, но в конце концов вы поймали ошибку и подавили сообщение об ошибке, которое вы хотели, не используя табуляцию!

Вопреки тому, что говорят выше, префикс @, используемый тщательно, не приводит к развалу крушения поезда. Это позволяет разработчику допускать ошибки в том, как они предпочитают.