Что такое использование символа @ в 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/

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

  2. добавление include с @ установит все ошибки в файле include на уровень ошибок 0


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