PHP поддерживает один оператор управления ошибками: знак @
.
В случае если он предшествует какому-либо выражению в PHP-коде, любые
сообщения об ошибках, генерируемые этим выражением, будут подавлены.
Если пользовательская функция обработчика ошибок установлена функцией set_error_handler(), она всё равно будет вызываться, даже если диагностика была подавлена.
До версии PHP 8.0.0 функция error_reporting(),
вызываемая внутри пользовательского обработчика ошибок,
всегда возвращала 0
, если ошибка была подавлена оператором @
.
Начиная с PHP 8.0.0 она возвращает значение этого (побитового) выражения:
E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE
.
Любое сообщение об ошибке, сгенерированное выражением,
доступно в элементе массива с ключом «message»
,
возвращаемого функцией error_get_last().
Результат этой функции будет меняться при каждой ошибке,
поэтому его необходимо проверить заранее.
<?php
/* Преднамеренная ошибка при работе с файлами */
$my_file = @file ('non_existent_file') or
die ("Ошибка при открытии файла: сообщение об ошибке было таким: '" . error_get_last()['message'] . "'");
// работает для любых выражений, а не только для функций
$value = @$cache[$key];
// В случае если ключа $key нет, сообщение об ошибке (notice) не будет отображено
Замечание: Оператор
@
работает только с выражениями. Есть простое правило: если что-то возвращает значение, значит, можно указать перед ним оператор@
. Например, можно указать оператор@
перед именем переменной, произвольной функцией, вызовом выражения include и т. д. При этом нельзя указывать этот оператор перед определением функции или класса, условными конструкциями, например:if
,foreach
и т. д.
До PHP 8.0.0 оператор @
мог подавлять критические ошибки,
которые прерывали выполнение скрипта.
Например, добавление оператора @
к вызову несуществующей функции,
когда она недоступна или вызвана с опечаткой,
приведёт к прерыванию выполнения скрипта без указания причины.