2009-06-23 2 views
469

Я видел использование @ перед некоторыми функциями, как следующее:Что такое символ @ в PHP?

$fileHandle = @fopen($fileName, $writeAttributes); 

Что такое использование этого символа?

+3

Оба RichieHindle и Aiden Bell дал правильный ответ, но так как я могу установить только один ответ, как принято, Я выберу первый. Извините Aiden –

+1

Подавление ошибок (хотя приятно) может привести к ошибкам в дороге при сохранении кода ... http://stackoverflow.com/a/7116175/282343 – dennismonsewicz

ответ

531

Он подавляет сообщения об ошибках - см. Error Control Operators в руководстве по PHP.

+31

Это было немного быстрой ничьей! –

+4

Да; до второго! Я должен был проверить идентификатор ответа, чтобы узнать, кто пришел первым :) – Sampson

+6

@Aiden: Оба мертвы в пыли. 8-) – RichieHindle

383

Он подавляет ошибки.

См Error Control Operators в руководстве:

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

Если вы установили пользовательскую функцию обработчика ошибок с set_error_handler() то он все равно будет вызываться, но этот обработчик ошибок может (и должен) вызов error_reporting() который будет возвращать 0, когда вызов, который вызвал ошибку предшествовала @ ...

+126

поддерживается только потому, что другой ответ получает всю любовь. – ajacian81

+5

@ ajacian81 - Привет! –

+7

19 позади ... c'mon люди будут бить RichieHindle: P –

52

Также обратите внимание, что, несмотря на скрытые ошибки, любой пользовательский обработчик ошибок (установленный с set_error_handler) будет выполняться!

180

Символ @ - это error control operator (он же оператор «тишина» или «запирание»). Это заставляет PHP подавлять любые сообщения об ошибках (уведомление, предупреждение, фатальный и т. Д.), Сгенерированные соответствующим выражением. Он работает точно так же, как унарный оператор, например, имеет приоритет и ассоциативность. Ниже приведены некоторые примеры:

@echo 1/0; 
// generates "Parse error: syntax error, unexpected T_ECHO" since 
// echo is not an expression 

echo @(1/0); 
// suppressed "Warning: Division by zero" 

@$i/0; 
// suppressed "Notice: Undefined variable: i" 
// displayed "Warning: Division by zero" 

@($i/0); 
// suppressed "Notice: Undefined variable: i" 
// suppressed "Warning: Division by zero" 

$c = @$_POST["a"] + @$_POST["b"]; 
// suppressed "Notice: Undefined index: a" 
// suppressed "Notice: Undefined index: b" 

$c = @foobar(); 
echo "Script was not terminated"; 
// suppressed "Fatal error: Call to undefined function foobar()" 
// however, PHP did not "ignore" the error and terminated the 
// script because the error was "fatal" 

Что именно произойдет, если вы используете обработчик ошибок вместо стандартного обработчика PHP ошибки:

Если вы установили пользовательскую функцию обработчика ошибок с set_error_handler() то он все равно будет вызван, но этот настраиваемый обработчик ошибок может (и должен) вызывать error_reporting(), который будет return 0, когда вызову, вызвавшему ошибку, предшествовал символ @.

Это показано в следующем примере кода:

function bad_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { 
    echo "[bad_error_handler]: $errstr"; 
    return true; 
} 
set_error_handler("bad_error_handler"); 
echo @(1/0); 
// prints "[bad_error_handler]: Division by zero" 

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

function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { 
    if(error_reporting() !== 0) { 
     echo "[better_error_handler]: $errstr"; 
    } 
    // take appropriate action 
    return true; 
} 
+28

Наиболее подробный и информативный ответ здесь. – rvighne

+3

Очень информативный. – Mark

+0

Позволяет отправить это на верх:/лучший подробный ответ. – rafamds

5

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

5

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

$fileHandle = fopen($fileName, $writeAttributes); 

А что, если файл, который мы пытаемся открыть не найден? Появится сообщение об ошибке.

Чтобы подавить сообщение об ошибке, мы с помощью оператора "@", как:

$fileHandle = @fopen($fileName, $writeAttributes); 
2

"@" подавляет сообщения об ошибках.

Он используется в фрагментах кода, как:

@file_get_contents('http://www.exaple.com'); 

Если домен «http://www.exaple.com» не доступен, ошибка будет отображаться, но с «@» ничего не показал.

1

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

Если вы установили пользовательскую функцию обработчика ошибок с set_error_handler() то он все равно будет вызываться, но этот обработчик ошибок может (и должен) вызов error_reporting() который будет возвращать 0, когда вызов, который вызвал ошибку предшествовал @ ,

<?php 
/* Intentional file error */ 
$my_file = @file ('non_existent_file') or 
    die ("Failed opening file: error was '$php_errormsg'"); 

// this works for any expression, not just functions: 
$value = @$cache[$key]; 
// will not issue a notice if the index $key doesn't exist. 

?> 

Примечание: -

1) Символ @ -оператором работает только с выражениями.

2) Простое эмпирическое правило: если вы можете принять значение чего-то, вы можете добавить к нему оператор @. Например, вы можете добавить его к переменным, функциям и включить вызовы, константы и т. Д. Вы не можете добавлять его к определениям функций или классов или условным структурам, таким как if и foreach, и так далее.

Предупреждение: -

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

23

Как уже некоторые ответили ранее: Оператор @ подавляет все ошибки в PHP, включая уведомления, предупреждения и даже критические ошибки.

НО:Пожалуйста, на самом деле не использовать оператор @ вообще.

Почему?

Ну, потому что, когда вы используете оператор @ для подавления ошибок, у вас нет никакой подсказки, где начать, когда возникает ошибка. У меня уже было «забавное» с унаследованным кодом, где некоторые разработчики часто использовали оператор @. Особенно в таких случаях, как операции с файлами, сетевые вызовы и т. Д.Это все случаи, когда многие разработчики рекомендуют использовать оператор @, так как это иногда выходит за пределы области действия, когда здесь возникает ошибка (например, API сторонней стороны может быть недоступен и т. Д.).

Но какой смысл все еще не использовать его? Давайте посмотрим с двух точек зрения:

Как разработчик: Когда @ используется, я совершенно не знаю, где начать. Если есть сотни или даже тысячи вызовов функций с @, ошибка может быть как у всех. В этом случае нет разумной отладки. И даже если это всего лишь ошибка 3rdparty - тогда это просто отлично, и вы закончили быстро. ;-) Кроме того, лучше добавить достаточное количество подробностей в журнал ошибок, поэтому разработчики могут легко решить, если запись в журнале - это что-то, что должно быть проверено дальше, или если это просто отказ третьей стороны, который выходит за рамки разработчика.

Как пользователь: Пользователи пофиг на все, что причиной возникновения ошибки или нет. Программное обеспечение там для работы, для завершения конкретной задачи и т. Д. Им все равно, является ли это ошибкой разработчика или проблемой третьего участника. Особенно для пользователей, я настоятельно рекомендую регистрировать все ошибки, даже если они выходят за рамки. Возможно, вы заметите, что определенный API часто отключается. Что ты можешь сделать? Вы можете поговорить с партнером по API, и если они не смогут сохранить стабильность, вам, вероятно, следует искать другого партнера.

Короче: Вы должны знать, что существует что-то вроде @ (знание всегда хорошо), но только не использовать его. Многие разработчики (особенно те, которые отлаживают код от других) будут очень благодарны.

+1

Некоторые предупреждения могут быть надежно подавлены с помощью @ (например, fopen(), где любая попытка предсказать результат зависит от состояния гонки), если у вас есть код для обработки условия ошибки более аккуратным способом, тогда usuig '@' это действительно полезно, особенно если вы не возвращаете клиенту «text/html» (или подобное). (возможно, возвращение 'image/png' или" json ") – Jasen

+0

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

1

Это может быть стоит добавить, здесь есть несколько указателей при использовании @ вы должны быть в курсе, для полного запуска вниз посмотреть сообщение: http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/

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

  2. Предварение включают с @ установит все ошибки в заголовочном файле на уровне погрешности 0

Смежные вопросы