#10. 4 php Оператор управления ошибками (собака, @)

Как было сказано ранее, типы отслеживаемых системой ошибок задаются директивой error_reporting конфигурационнного файла php.ini. Также говорилось, что значение error_reporing может быть локально установлено для текущего скрипта.

Независимо от текущего значения error_reporting, можно отключить вывод сообщений об ошибках, генерируемых некоторым PHP-выражением, применив к этому выражению оператор @:

<?php
echo @$x; /*предупреждение об использовании неинициализированной переменной
            подавляется оператором @ */

Справедливы следующие утверждения, касающиеся данного оператора:

  • Он отключает вывод сообщений как в окно браузера, так и в лог-файл;
  • Начиная с версии PHP 8.0, сообщения о фатальных ошибках, вызывающих прерывание скрипта, не подавляются. Таким образм, результатом строк
    <?php
    @trigger_error("Неустранимая ошибка", E_USER_ERROR); 
    
    echo "Конец программы";
    

    в PHP старых версий будет завершение работы скрипта без каких-либо оповещений. В версиях PHP 8.0 и выше будет выведено сообщение:

    Fatal error: Неустранимая ошибка in /var/www/mysite/index.php on line 2

  • Операндом может быть любое выражение, возвращающее некоторое значение. Нельзя использовать @ перед конструкциями if, for, перед определениями функций и т.д. — то есть перед тем, что не является выражением (не возвращает никакого значения) . Пример ошибочного использования:
    <?php
    @echo $x; //ошибка — "echo $x" не является выражением
    
  • Нужно с аккуратностью использовать перед вызовом функции, так как при этом будет отключен контроль всех ошибок, возникающих как внутри этой функции, так и во всех вложенных в неё функциях и подключаемых файлах. Например:
    <?php
    function foo()
    {
        bar();
    }
    
    function bar()
    {  
       trigger_error("Какое-то важное предупреждение, "
               . "которое будет проигнорировано", E_USER_WARNING); 
    }
    
    @foo();
    
    echo "Конец программы";
      

    Результат:
    Конец программы

  • Если зарегистрирован пользовательский обработчик ошибок, то он в любом случае будет вызван.

Замечание: Отключение обработки ошибок пользовательской функцией в старых версиях PHP (до PHP 8.0)

Для отключения диагностики ошибок пользовательским обработчиком в старых версиях можно было использовать тот факт, что на время выполнения оператора @ значение error_reporting устанавливается равным 0, и явно осуществлять выход из обработчика в этом случае:

<?php
function my_handler($errno, $msg, $file, $line)
{
    if (error_reporting() == 0) {
        return;
    }
    echo $msg;
}

Начиная с PHP 8.0, на время выполнения оператора управления ошибками функция error_reportig(), вызываемая внутри пользовательского обработчика ошибок, возвращает значение E_ALL | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE.