Hi internals,
It just came to my attention that there is a change of behaviour between
PHP 8.1 and 8.2 in the way iterable is decomposed, or not, into
Traversable|array when reflected:
function foo(): iterable {}
function bar(): stdClass|iterable {}
echo (new ReflectionFunction('foo'))->getReturnType(), PHP_EOL;
echo (new ReflectionFunction('bar'))->getReturnType(), PHP_EOL;
Output on PHP 8.1:
iterable
stdClass|iterable
Output on PHP 8.2:
iterable
stdClass|Traversable|array
Is this expected behaviour? Or should I file a bug? I'm particularly
surprised that it behaves this way on PHP 8.2 only in the presence of union
types.
Thank you,
Benjamin
Hi internals,
It just came to my attention that there is a change of behaviour between
PHP 8.1 and 8.2 in the way iterable is decomposed, or not, into
Traversable|array when reflected:function foo(): iterable {} function bar(): stdClass|iterable {} echo (new ReflectionFunction('foo'))->getReturnType(), PHP_EOL; echo (new ReflectionFunction('bar'))->getReturnType(), PHP_EOL;
Output on PHP 8.1:
iterable stdClass|iterable
Output on PHP 8.2:
iterable stdClass|Traversable|array
Is this expected behaviour? Or should I file a bug? I'm particularly
surprised that it behaves this way on PHP 8.2 only in the presence of union
types.Thank you,
Benjamin
That's a intentional behaviour change and related to this accepted PHP
8.2 RFC: https://wiki.php.net/rfc/iterator_xyz_accept_array
Smile,
Juliette