Что такое использование символа @ в PHP?
Я видел использование @
перед определенными функциями, например:
$fileHandle = @fopen($fileName, $writeAttributes);
в чем польза этого символа?
11 ответов
Она подавляет сообщения об ошибках - см. Операторы Контроля Ошибок в руководстве по PHP.
Он подавляет ошибки.
посмотреть Операторы Контроля Ошибок в руководстве:
PHP поддерживает один оператор управления ошибками: знак at (@). При добавлении к выражению в PHP любые сообщения об ошибках, которые могут быть сгенерированы этим выражением, будут проигнорированы.
Если вы установили собственную функцию обработки ошибок с set_error_handler () тогда он все равно будет вызываться, но этот пользовательский обработчик ошибок может (и следует) call предназначенных() который вернет 0, когда вызов, вызвавший ошибку, предшествовал @...
на @
символ контроль ошибок оператор (он же оператор "тишина" или "заткнись"). Это заставляет 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() , который будет возвращает 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;
}
также обратите внимание, что, несмотря на скрытые ошибки, любой пользовательский обработчик ошибок (установлен с set_error_handler
) все равно будет выполнена!
как уже ответили раньше:@
оператор подавляет все ошибки в PHP, включая уведомления, предупреждения и даже критические ошибки.
но: пожалуйста, не используйте @
оператор на всех.
почему?
Ну, потому что, когда вы используете @
оператор для подавления ошибок, вы понятия не имеете, с чего начать, когда возникает ошибка. Я уже повеселился." с устаревшим кодом, где некоторые разработчики использовали @
оператор довольно часто. Особенно в таких случаях, как файловые операции, сетевые вызовы и т. д. Это все случаи, когда многие разработчики рекомендуют использовать @
оператор, поскольку это иногда выходит за рамки, когда здесь возникает ошибка (например, API 3rdparty может быть недоступен и т. д.).
но какой смысл все еще не использовать его? Давайте посмотрим с двух точек зрения:
как разработчик:, когда @
используется, Я понятия не имею, с чего начать. Если есть сотни или даже тысячи вызовов функций с @
ошибка может быть как everyhwere. В этом случае разумная отладка невозможна. И даже если это всего лишь ошибка 3rdparty - тогда все в порядке, и вы быстро закончите. ;- ) Кроме того, лучше добавить достаточно деталей в журнал ошибок, поэтому разработчики могут легко решить, является ли запись в журнале чем-то, что должно быть проверено дальше или если это просто ошибка 3rdparty, которая выходит за рамки разработчика.
как пользователь: пользователям все равно, какова причина ошибки или нет. Программное обеспечение есть для их работы,для выполнения конкретной задачи и т. д. Им все равно, виноват ли разработчик или проблема 3rdparty. Особенно для пользователей, я настоятельно рекомендую регистрировать все ошибки, даже если они выходят за рамки. Возможно, вы заметите, что конкретный API часто отключается. Что? ты можешь? Вы можете поговорить со своим партнером по API, и если они не могут сохранить его стабильным, вам, вероятно, следует искать другого партнера.
короче: вы должны знать, что существует что-то вроде @
(знание всегда хорошо), но только не использовать. Многие разработчики (особенно те, которые отлаживают код от других) будут очень благодарны.
при сбое открытия генерируется Ошибка уровня E_WARNING. Вы можете использовать @ для подавления этого предупреждения.
предположим, что мы не использовали оператор"@", тогда наш код будет выглядеть так:
$fileHandle = fopen($fileName, $writeAttributes);
а что, если файл, который мы пытаемся открыть, не найден? Он покажет сообщение об ошибке.
чтобы подавить сообщение об ошибке, мы используем оператор "@" как:
$fileHandle = @fopen($fileName, $writeAttributes);
@
подавляет сообщения об ошибках.
Он используется в фрагменты код:
@file_get_contents('http://www.exaple.com');
если домен"http://www.exaple.com " недоступно, будет показана ошибка, но с @
ничего не показал.
PHP поддерживает один оператор управления ошибками: знак at (@)
. При добавлении к выражению в 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, и так далее далее.
предупреждение:-
в настоящее время префикс оператора управления ошибками " @ " будет даже отключен отчеты об ошибках для критических ошибок, которые завершат сценарий исполнение. Среди прочего, это означает, что если вы используете " @ " для подавление ошибок из определенной функции, и либо она недоступна или был напечатан неправильно, сценарий умрет прямо там без указанием причины.
возможно, стоит добавить здесь несколько указателей при использовании@, о котором вы должны знать, для полного просмотра этого сообщения: http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/
обработчик ошибок по-прежнему запускается даже с символом@, это просто означает, что установлен уровень ошибки 0, это должно быть обработано соответствующим образом в пользовательской ошибке обработчик.
добавление include с @ установит все ошибки в файле include на уровень ошибок 0
@
подавляет сообщение об ошибке, выданное функцией. fopen
выдает ошибку, когда файл не существует. @
символ заставляет выполнение перейти к следующей строке, даже если файл не существует. Мое предложение не будет использовать это в вашей локальной среде при разработке PHP-кода.