On Sat, 23 Apr 2022 at 19:06, Larry Garfield <la...@garfieldtech.com> wrote:
> On Sat, Apr 23, 2022, at 7:27 AM, G. P. B. wrote: > > Hello internals, > > > > One area the engine currently needs to take special care is dealing with > > the typing relation between iterable, Traversable, and array. > > The change is to canonicalize "iterable" into "array|Traversable" as this > > then removes this special case. > > > > However, doing so breaks Reflection for iterable types and will now > return > > a ReflectionUnionType instead of a ReflectionNamed type. > > There are a couple of options to proceed: > > - Accept the BC break, and expect end users to already be handling union > > types for code running on 8.2 (least complexity) > > - Only provide a BC layer for (?)iterable to return a > ReflectionNamedType > > and have usages of iterable in a union type be exposed as > Traversable|array > > (OK complexity) > > - Full BC such that even in union types where iterabl was used > > Traversable|array gets converted back to iterable (high complexity) > > > > The PR for this change is https://github.com/php/php-src/pull/7309 > > > > This PR is also blocking the implementation for DNF types, as it vastly > > simplifies the implementation of it. > > > > Best regards, > > > > George P. Banyard > > To make sure I understand, > > Option 1: > > * function foo(iterable $i) // $i is ReflectionUnionType of > array,traversable > * function foo(iterable|Beep $i) // $i is ReflectionUnionType of > array,Traversable,Beep > > Option 2: > > * function foo(iterable $i) // $i is ReflectionNamedType of iterable > * function foo(iterable|Beep $i) // $i is ReflectionUnionType of > array,Traversable,Beep > > Option 3: > > * function foo(iterable $i) // $i is ReflectionNamedType of iterable > * function foo(iterable|Beep $i) // $i is ReflectionUnionType of > iterable,Beep > > Am I following correctly? > > If so, I'm fine with 1 or 2. I... cannot imagine a situation where > someone is doing iterable|Beep to begin with, so I don't really care if > that is a slight break. > > Though... I do have some code that might get cranky with Option 1, as it > doesn't deal with union types at all (for various reasons). I don't think > it currently deals with iterables either, which is possibly an > oversight... So, I think my preference would be 2, 1, no 3. > > --Larry Garfield > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > > Correct, and a better way of visualising than I did. I do think option 2 is the most reasonable. Best regards, George P. Banyard