Hi internals,
Since PHP 8.0, error_reporting()
started returning a non-zero value when
the @ silence operator is used.
Demo: https://3v4l.org/CovYv
Is this intentional? This breaks scripts that converted all errors to
exceptions, except those where the silence operator was used:
set_error_handler(function ($severity, $message, $file, $line) {
if (error_reporting() === 0) {
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
});
Thank you,
Benjamin
On Wed, Dec 2, 2020 at 2:56 PM Benjamin Morel benjamin.morel@gmail.com
wrote:
Hi internals,
Since PHP 8.0,
error_reporting()
started returning a non-zero value when
the @ silence operator is used.Demo: https://3v4l.org/CovYv
Is this intentional? This breaks scripts that converted all errors to
exceptions, except those where the silence operator was used:set_error_handler(function ($severity, $message, $file, $line) { if (error_reporting() === 0) { return; } throw new ErrorException($message, 0, $severity, $file, $line); });
Thank you,
Benjamin
Search for "error_reporting()" on
https://www.php.net/manual/en/migration80.incompatible.php, it discusses
exactly this code ;)
Regards,
Nikita
Thanks for the pointer, Nikita.
I think the updated example (using error_reporting() & $errno
) fails to
mimic exactly what error_reporting() === 0
did, though.
Say your php.ini mutes E_WARNING, for example:
error_reporting = `E_ALL` & ~E_WARNING
Checking for error_reporting() === 0
allowed to only ignore @-suppressed
statements, but still throw an exception on E_WARNING, ignoring the
error_reporting set in php.ini.
OTOH, checking for error_reporting() & $errno
still allows to
ignore @-suppressed statements, but also ignores E_WARNING
configured in
php.ini, which is not always what userland code wants.
I'm not sure how userland code can now replicate the old behaviour, i.e.
specifically detect the @ operator?
— Benjamin
On Wed, Dec 2, 2020 at 3:14 PM Benjamin Morel benjamin.morel@gmail.com
wrote:
Thanks for the pointer, Nikita.
I think the updated example (using
error_reporting() & $errno
) fails to
mimic exactly whaterror_reporting() === 0
did, though.Say your php.ini mutes E_WARNING, for example:
error_reporting = `E_ALL` & ~E_WARNING
Checking for
error_reporting() === 0
allowed to only ignore @-suppressed
statements, but still throw an exception on E_WARNING, ignoring the
error_reporting set in php.ini.OTOH, checking for
error_reporting() & $errno
still allows to
ignore @-suppressed statements, but also ignoresE_WARNING
configured in
php.ini, which is not always what userland code wants.I'm not sure how userland code can now replicate the old behaviour, i.e.
specifically detect the @ operator?
First off: Please don't do this. Error_reporting should be respected
independently of how it was set.
Now, if you do want to approximately distinguish @, you can do it the same
way you did before: Check for the value it sets. Previously that was 0
(which you also couldn't distinguish from error_reporting=0 set in
php.ini). Now it will be E_ERROR
| E_CORE_ERROR
| E_COMPILE_ERROR
|
E_USER_ERROR
| E_RECOVERABLE_ERROR
| E_PARSE, or whatever that evaluates to.
Regards,
Nikita