królik

Wpływ silence operatora na error reporting w PHP

Hej, w dzisiejszym krótkim wpisie bierzemy na tapet słynny i jakże często używany operator @ tzw. STFU. Czy wiesz że jego użycie ma wpływ na error_reporting w PHP? Weźmy pod lupę ten przykład:

<?php declare(strict_types=1);

error_reporting(E_ALL);

set_error_handler(
    function () {
        // int(0) [PHP <= 7.4]
        // int(4437) [PHP >= 8.0]
        var_dump(error_reporting());
    },
    E_ALL
);

// int(32767) [E_ALL]
var_dump(error_reporting());

@trigger_error('warning', E_USER_WARNING);

Na początku ustawiamy error_reporting na najwyższy poziom E_ALL. Następnie konfigurujemy error handler by wyłapywał wszystkie możliwe błędy – wartość E_ALL. Finalnie wyzwalamy błąd typu warning. Błąd ten wpada do wcześniej zdefiniowanego error handler. Jednak podczas jego obsługi okazuje się że PHP tymczasowo zmienił wartość error_reporting na inną. Dzięki tej zmianie wszelkie błędy zostały wyciszone i nie zostały wyświetlone na wyjściu.

Mimo wyciszenia błąd i tak został przekazany do error handler. Pozwala to na jego obsługę poprzez np. zapis do pliku z logami. Jest to wzorzec stosowany m.in. przez Symfony.