Dear Levi, I will add a test case to the PR to ensure that things work properly in the described situation.
On Fri, Jun 26, 2020 at 3:57 PM Levi Morrison <levi.morri...@datadoghq.com> wrote: > > On Fri, Jun 26, 2020 at 12:45 AM Alex <alexinbeij...@gmail.com> wrote: > > > > Dear PHP Internals, > > > > I would like to propose a backwards-incompatible change to > > SplFixedArray which fixes the strange and almost certainly unintended > > behavior reported in Bug 79404 > > (https://bugs.php.net/bug.php?id=79404). > > > > In short: Because SplFixedArray is an Iterator, and stores its own > > iteration state, it cannot be used in nested foreach loops. If you > > try, the inner loop will overwrite the iteration position of the outer > > loop, so that the outer loop 'thinks' it is finished after the inner > > loop finishes. > > > > To illustrate: > > > > $spl = SplFixedArray::fromArray([0, 1]); > > foreach ($spl as $a) { > > foreach ($spl as $b) { > > echo "$a $b"; > > } > > } > > > > Only prints two lines: > > > > 0 0 > > 0 1 > > > > The fix is to convert SplFixedArray to an IteratorAggregate, so each > > nested foreach loop operates on a different iterator object and thus > > nested loops don't interfere with each other. > > > > Now, it would be possible to do this while still defining key(), > > current(), next(), etc. methods on SplFixedArray. However, that would > > cause an even more insidious BC break, since these methods would no > > longer work as formerly when called in the body of a foreach loop. > > Therefore, I think it better to remove them. This may break a few > > users' code, but in a way which will be easier for them to debug than > > if the old methods were kept but subtly changed in behavior. > > > > Code to implement this change is here: > > https://github.com/php/php-src/pull/5384/files > > > > Your comments will be appreciated, > > Alex Dowad > > > > -- > > PHP Internals - PHP Runtime Development Mailing List > > To unsubscribe, visit: https://www.php.net/unsub.php > > > > As someone who has patches in the SPL, I support the idea of this > change. One gotcha of aggregates is iterator invalidation; are you > sure the patch takes care of it? If you have an array of size 3, get > an iterator, iterate to offset 2, shrink the size with `setSize`, and > use the iterator at offset 2, will everything be okay? -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php