Re: [PHP-DEV] Re: Making all Traversables an Iterator or IteratorAggregate

This is only part of a thread. view whole thread
  110451
June 9, 2020 14:52 michal.brzuchalski@gmail.com (=?UTF-8?Q?Micha=C5=82_Brzuchalski?=)
wt., 9 cze 2020, 15:33 użytkownik Nikita Popov ppv@gmail.com>
napisał:

> On Tue, May 12, 2020 at 10:26 AM Nikita Popov ppv@gmail.com> > wrote: > > > On Wed, Mar 11, 2020 at 10:50 AM Nikita Popov ppv@gmail.com> > > wrote: > > > >> Hi internals, > >> > >> Userland classes that implement Traversable must do so either through > >> Iterator or IteratorAggregate. The same requirement does not exist for > >> internal classes: They can implement the internal get_iterator > mechanism, > >> without exposing either the Iterator or IteratorAggregate APIs. This > makes > >> them usable in get_iterator(), but incompatible with any Iterator based > >> APIs. > >> > > > > This should have said: "This makes them usable in foreach(), but > > incompatible with any Iterator based APIs." > > > > A lot of internal classes do this, because exposing the userland APIs is > >> simply a lot of work. I would like to add a general mechanism to make > this > >> simpler: https://github.com/php/php-src/pull/5216 adds a generic > >> "InternalIterator" class, that essentially converts the internal > >> get_iterator interface into a proper Iterator. Internal classes then > only > >> need to a) implement the IteratorAggregate interface and b) add a > >> getIterator() method with an implementation looking like this: > >> > >> // WeakMap::getIterator(): Iterator > >> ZEND_METHOD(WeakMap, getIterator) > >> { > >> if (zend_parse_parameters_none() == FAILURE) { > >> return; > >> } > >> zend_create_internal_iterator_zval(return_value, ZEND_THIS); > >> } > >> > >> This allows internal classes to trivially implement IteratorAggregate, > >> and as such allows us to enforce that all Traversables implement > Iterator > >> or IteratorAggregate. > >> > > > > Does anyone have thoughts on this change? Mostly this is a feature for > > extensions, but also user-visible in that a bunch of classes will switch > > from being Traversable to being IteratorAggregate. > > > > We may also want to convert some existing Iterators to > IteratorAggregates. > > For example SplFixedArray currently implements Iterator, which means that > > it's not possible to have nested loops over SplFixedArray. We could now > > easily fix this by switching it to use IteratorAggregate, which will > allow > > multiple parallel iterators to work on the same array. Of course, there > is > > BC break potential in such a change. > > > > There's some bikeshed potential here regarding the class name. I picked > > "InternalIterator" as an iterator for internal classes, but "internal > > iteration" is also a technical term (the opposite of "external > iteration"), > > so maybe that name isn't ideal. > > > > Unfortunately this bikeshed remains unpainted... The proposed names were: > > 1. InternalIterator > 2. ZendIterator > 3. IteratorForExtensionClassImplementations > 4. EngineIterator > > I'm somewhat partial to the third option, with a less verbose name: > IteratorForExtensions. >
ExtensionsIterator?? BR, Michał
>