Какая польза от символа @ в PHP? - PullRequest
545 голосов
/ 23 июня 2009

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

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

Какая польза от этого символа?

Ответы [ 11 ]

608 голосов
/ 23 июня 2009

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

442 голосов
/ 23 июня 2009

Подавляет ошибки.

См. Операторы контроля ошибок в руководстве:

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

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

219 голосов
/ 25 января 2013

Символ @ означает контроль ошибок оператор (он же оператор "тишина" или "отключение"). Это заставляет 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;
}
58 голосов
/ 11 января 2010

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

32 голосов
/ 27 апреля 2016

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

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

Почему?

Что ж, потому что, когда вы используете оператор @ для подавления ошибок, вы вообще не знаете, с чего начать, когда происходит ошибка. Я уже немного повеселился с устаревшим кодом, когда некоторые разработчики довольно часто использовали оператор @. Особенно в таких случаях, как файловые операции, сетевые вызовы и т. Д. Во всех этих случаях многие разработчики рекомендуют использовать оператор @, поскольку это иногда выходит за рамки возможного, когда здесь возникает ошибка (например, API-интерфейс 3-го лица может быть недоступен и т. д.).

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

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

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

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

7 голосов
/ 22 марта 2015

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

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

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

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

$fileHandle = @fopen($fileName, $writeAttributes);
5 голосов
/ 12 августа 2013

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

4 голосов
/ 14 октября 2015

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

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

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

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

1 голос
/ 10 августа 2018

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

1 голос
/ 30 июня 2016

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

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

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

...