====== PHP RFC: Allow int type argument to BCMath function ======
* Version: 0.9
* Date: 2024-07-08
* Author: Saki Takamachi (saki@php.net)
* Status: Under Discussion
* First Published at: https://wiki.php.net/rfc/allow_int_args_to_bcmath_function
===== Introduction =====
Currently, BCMath functions only accept values as strings. If want to calculate an int type with BCMath, need to convert it to a string once, which incurs unnecessary conversion costs.
===== Proposal =====
This RFC proposes adding an int type to the BCMath function argument and making the argument a union type of int and string.
That is, the function signature changes to:
function bcadd(int|string $num1, int|string $num2, ?int $scale = null): string {}
function bcsub(int|string $num1, int|string $num2, ?int $scale = null): string {}
function bcmul(int|string $num1, int|string $num2, ?int $scale = null): string {}
function bcdiv(int|string $num1, int|string $num2, ?int $scale = null): string {}
function bcmod(int|string $num1, int|string $num2, ?int $scale = null): string {}
function bcpowmod(int|string $num, int|string $exponent, int|string $modulus, ?int $scale = null): string {}
function bcpow(int|string $num, int|string $exponent, ?int $scale = null): string {}
function bcsqrt(int|string $num, ?int $scale = null): string {}
function bccomp(int|string $num1, int|string $num2, ?int $scale = null): int {}
function bcround(int|string $num, int $precision = 0, int $mode = PHP_ROUND_HALF_UP): string {}
Note that even if the only numbers passed as arguments are ints, the return value will always be a string.
I do not change anything for the following three functions. bcscale() is not a calculation function, so exclude it. bcfloor() and bcceil() are excluded because there is no point in allowing int type arguments due to the characteristics of their functions.
function bcscale(?int $scale = null): int {}
function bcfloor(string $num): string {}
function bcceil(string $num): string {}
===== Backward Incompatible Changes =====
Any code that uses strict types and expects an error to occur when passing an int to these functions is affected because the error no longer occurs.
===== Proposed PHP Version(s) =====
next PHP 8.x (8.4)
===== RFC Impact =====
==== To SAPIs ====
None.
==== To Existing Extensions ====
Only BCMath.
==== To Opcache ====
None.
==== New Constants ====
None.
==== php.ini Defaults ====
None.
===== Open Issues =====
None.
===== Unaffected PHP Functionality =====
There is no effect on anything other than BCMath.
===== Future Scope =====
None.
===== Proposed Voting Choices =====
There is a yes/no choice whether to accept this RFC and requires a 2/3 majority vote to be accepted.
===== Patches and Tests =====
yet
===== Implementation =====
yet
===== References =====
https://externals.io/message/123924
===== Rejected Features =====
None.