On Tue, 17 Jan 2023, G. P. B. wrote:

> I would like to start the discussion about the Saner 
> array_(sum|product)() RFC: 
> https://wiki.php.net/rfc/saner-array-sum-product
> 
> Currently, the array_sum() and array_product() behave differently than 
> their userland implementation as they ignore arrays and objects, and 
> cast the remaining types to int/float. This is in contrast with the 
> behaviour of arithmetic operators that throw TypeErrors on types and 
> values that are not interpretable as int/float.
> 
> This RFC aims to resolve this discrepancy.

I think I agree with the premise of this RFC, but I do think a few 
details are wrongly addressed.

First of all, a clarification why this produces int(4) would be useful:

        $input = [true, STDERR, new stdClass(), [], gmp_init(6)];
        $output = array_sum($input);

I had to look up that STDERR would cast to int(3) :-)

I don't understand why this would result in a warning and a return of 
int(50):

        $a = [10, 15.6, gmp_init(25)];
        var_dump(array_sum($a));

Why doesn't this return float(50.6) instead? I realise that the 
array_reduce variant (below) does the same, but it's not what I would 
expect:

        <?php
        $input = [10, 15.6, gmp_init(25)];
        $output = array_reduce($input, fn($carry, $value) => $carry + $value, 
0);

I think the phrase "If traversing the array transforms the return value 
into an object, if that object is not numerically castable an E_WARNING 
is emitted and the initial return value is returned instead, which may 
change the return value if scalar values were present in the array. " 
should come with an example :-)


cheers,
Derick

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to