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().
Результат функции изменяется при каждой ошибке,
поэтому результат лучше проверить заранее.
Пример #1 Преднамеренная ошибка считывания файла
<?php
$my_file = @file('non_existent_file') or
die("При открытии файла возникла ошибка: '" . error_get_last()['message'] . "'");
?>
Пример #2 Подавление ошибок в выражениях
<?php
// Оператор работает с каждым выражением, а не только с функциями
$value = @$cache[$key];
// Уведомление не отобразится, если массив не содержит ключ $key
?>
Замечание: Оператор
@
работает только с выражениями. Простое эмпирическое правило: оператор@
добавляют перед инструкциями, которые вычисляются как значение. Оператор@
указывают перед названием переменной, произвольной функцией, вызовом выражения include и т. д. При этом нельзя указывать оператор перед определением функции или класса, условными конструкциями наподобиеif
, цикломforeach
и другими инструкциями, которые не вычисляются как значение.
До PHP 8.0.0 оператор @
подавлял критические ошибки,
которые прерывали выполнение скрипта.
Скрипт завершал выполнение без указания причины,
если оператор @
указывали, например, перед вызовом функции,
которую не определили, не импортировали или в названии которой допустили опечатку.