Я видел использование @
перед некоторыми функциями, как следующее:Что такое символ @ в PHP?
$fileHandle = @fopen($fileName, $writeAttributes);
Что такое использование этого символа?
Я видел использование @
перед некоторыми функциями, как следующее:Что такое символ @ в PHP?
$fileHandle = @fopen($fileName, $writeAttributes);
Что такое использование этого символа?
Он подавляет сообщения об ошибках - см. Error Control Operators в руководстве по PHP.
Это было немного быстрой ничьей! –
Да; до второго! Я должен был проверить идентификатор ответа, чтобы узнать, кто пришел первым :) – Sampson
@Aiden: Оба мертвы в пыли. 8-) – RichieHindle
Он подавляет ошибки.
См Error Control Operators в руководстве:
PHP поддерживает один оператор управления ошибками: знак (@). При добавлении выражения в PHP любые сообщения об ошибках, которые могут быть сгенерированы этим выражением, будут игнорироваться.
Если вы установили пользовательскую функцию обработчика ошибок с set_error_handler() то он все равно будет вызываться, но этот обработчик ошибок может (и должен) вызов error_reporting() который будет возвращать 0, когда вызов, который вызвал ошибку предшествовала @ ...
поддерживается только потому, что другой ответ получает всю любовь. – ajacian81
@ ajacian81 - Привет! –
19 позади ... c'mon люди будут бить RichieHindle: P –
Также обратите внимание, что, несмотря на скрытые ошибки, любой пользовательский обработчик ошибок (установленный с set_error_handler
) будет выполняться!
Символ @
- это 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;
}
Если сбой не работает, генерируется ошибка уровня E_WARNING. Вы можете использовать @ для подавления этого предупреждения.
Предположим, что мы не использовали оператора «@», то наш код будет выглядеть следующим образом:
$fileHandle = fopen($fileName, $writeAttributes);
А что, если файл, который мы пытаемся открыть не найден? Появится сообщение об ошибке.
Чтобы подавить сообщение об ошибке, мы с помощью оператора "@", как:
$fileHandle = @fopen($fileName, $writeAttributes);
"@" подавляет сообщения об ошибках.
Он используется в фрагментах кода, как:
@file_get_contents('http://www.exaple.com');
Если домен «http://www.exaple.com» не доступен, ошибка будет отображаться, но с «@» ничего не показал.
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, и так далее.
Предупреждение: -
В настоящее время «@» префикс оператора ошибок управления даже отключить отчетов об ошибках для критических ошибок, которые оканчиваются сценарий выполнение. Помимо прочего, это означает, что если вы используете «@» до , то подавляйте ошибки из определенной функции, и либо она недоступна , либо был опечатан, сценарий будет умирать прямо там, не указывая .
Как уже некоторые ответили ранее: Оператор @
подавляет все ошибки в PHP, включая уведомления, предупреждения и даже критические ошибки.
НО:Пожалуйста, на самом деле не использовать оператор @
вообще.
Почему?
Ну, потому что, когда вы используете оператор @
для подавления ошибок, у вас нет никакой подсказки, где начать, когда возникает ошибка. У меня уже было «забавное» с унаследованным кодом, где некоторые разработчики часто использовали оператор @
. Особенно в таких случаях, как операции с файлами, сетевые вызовы и т. Д.Это все случаи, когда многие разработчики рекомендуют использовать оператор @
, так как это иногда выходит за пределы области действия, когда здесь возникает ошибка (например, API сторонней стороны может быть недоступен и т. Д.).
Но какой смысл все еще не использовать его? Давайте посмотрим с двух точек зрения:
Как разработчик: Когда @
используется, я совершенно не знаю, где начать. Если есть сотни или даже тысячи вызовов функций с @
, ошибка может быть как у всех. В этом случае нет разумной отладки. И даже если это всего лишь ошибка 3rdparty - тогда это просто отлично, и вы закончили быстро. ;-) Кроме того, лучше добавить достаточное количество подробностей в журнал ошибок, поэтому разработчики могут легко решить, если запись в журнале - это что-то, что должно быть проверено дальше, или если это просто отказ третьей стороны, который выходит за рамки разработчика.
Как пользователь: Пользователи пофиг на все, что причиной возникновения ошибки или нет. Программное обеспечение там для работы, для завершения конкретной задачи и т. Д. Им все равно, является ли это ошибкой разработчика или проблемой третьего участника. Особенно для пользователей, я настоятельно рекомендую регистрировать все ошибки, даже если они выходят за рамки. Возможно, вы заметите, что определенный API часто отключается. Что ты можешь сделать? Вы можете поговорить с партнером по API, и если они не смогут сохранить стабильность, вам, вероятно, следует искать другого партнера.
Короче: Вы должны знать, что существует что-то вроде @
(знание всегда хорошо), но только не использовать его. Многие разработчики (особенно те, которые отлаживают код от других) будут очень благодарны.
Некоторые предупреждения могут быть надежно подавлены с помощью @ (например, fopen(), где любая попытка предсказать результат зависит от состояния гонки), если у вас есть код для обработки условия ошибки более аккуратным способом, тогда usuig '@' это действительно полезно, особенно если вы не возвращаете клиенту «text/html» (или подобное). (возможно, возвращение 'image/png' или" json ") – Jasen
Вы не должны подавлять предупреждения - они заявляют, что вы сделали что-то неправильно. Нет состояния гонки, в котором вы не можете правильно проверить или обработать состояние. –
Это может быть стоит добавить, здесь есть несколько указателей при использовании @ вы должны быть в курсе, для полного запуска вниз посмотреть сообщение: http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/
Обработчик ошибок по-прежнему обстреляли даже с символ @ добавлен, это означает, что установлен уровень ошибки 0, это должно быть надлежащим образом обработано в пользовательском обработчике ошибок.
Предварение включают с @ установит все ошибки в заголовочном файле на уровне погрешности 0
Оба RichieHindle и Aiden Bell дал правильный ответ, но так как я могу установить только один ответ, как принято, Я выберу первый. Извините Aiden –
Подавление ошибок (хотя приятно) может привести к ошибкам в дороге при сохранении кода ... http://stackoverflow.com/a/7116175/282343 – dennismonsewicz