PHP 8.0: New fdiv function
PHP 8 adds a new fdiv() function to fit along functions such as fmod() and intdiv().
As of now, attempting a divide a number by zero results in inconsistent behavior.
Division operator triggers warnings
$num = 1 / 0;
// Warning: Division by zero in ... on line ...
intdiv() function throws DivisionByZeroError exceptions
$num = intdiv(1, 0);
// Fatal error: Uncaught DivisionByZeroError: Division by zero in ...:...
Modulo operator throws DivisionByZeroError exceptions
$mod = 1 % 0;
// Fatal error: Uncaught DivisionByZeroError: Modulo by zero in ...:...
Semantically, the division operator should throw a DivisionByZeroError exception as well, but due to backwards compatibility issues, it is still a warning.
In an attempt to streamline this, Nikita suggested to add the new fdiv() function.
This function will follow the IEEE-754 standard on Floating-Point Arithmetic, and return NAN, or ±INF as float. The return value of fdiv will be identical to the current division operator's behavior.
## +INF
fdiv(1, 0); // float(INF)
$num = 1 / 0; // float(INF)
// Warning: Division by zero in ... on line ...
## -INF
fdiv(-1, 0); // float(-INF)
$num = -1 / 0; // float(-INF)
// Warning: Division by zero in ... on line ...
The division operator will eventually throw DivisionByZeroError when this function is well-established in the future.
Polyfill
A PHP 7.0+ polyfill that mimics the new fdiv() function:
if (!function_exists('fdiv')) {
function fdiv(float $dividend, float $divisor): float {
return @($dividend / $divisor);
}
}
Backwards compatibility impact
fdiv() is a new function. A quick GitHub search did not reveal any positive results for existing code that declares a function with the same name.
It is recommended that you use this function whenever possible (see the polyfill above) because division by zero using division operator is already triggering a PHP warning in your existing code, which will escalate to a DivisionByZeroError exception in the future.