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.