Оператор управления ошибками

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 оператор @ подавлял критические ошибки, которые прерывали выполнение скрипта. Скрипт завершал выполнение без указания причины, если оператор @ указывали, например, перед вызовом функции, которую не определили, не импортировали или в названии которой допустили опечатку.