On Thu, 2012-07-12 at 00:17 +0200, Nikita Popov wrote:
> Hi internals!
> 
> Currently PHP does not have an internal iteration API that supports
> both arrays and Traversable objects. 

Yes. in fact doing that is long overdue.

> Because of that it is currently
> not really possible to write functions (or language features) that
> work on arbitrary traversables. That's probably also the reason why
> function like array_sum() currently work only on arrays and arrays
> only.

One thing to keep in mind when doing this is to think about consistency.
Right there's quite a distinction. Things either take an array or a
Traversable object. We should think about not creating a mess when some
functions, especially ones called array_foo() allow Traversable while
others won't. So we might need the same infrastructure in regards to
ArrayAccess to help this a bit.

Just picking some random example:

      * array_map() - This can be implemented using that infrastructure.
        (While some might think about returning an Traversable object if
        a Traversable object got put in, maybe a FilterIterator but
        let's ignore that)
      * array_filter() - This is almost the same as array_map() but we
        can't implement it using Traversable, as current() (for good
        reasons) returns no reference.

Another "fun fact" might be that Traversable doesn't require keys to be
unique. This can have strange results for things like array_map().

Just to be clear I fully support it, but this is an area which clearly
requires some more global design. Maybe even going through all functions
processing arrays and categorizing them to see the impact.

        Ah, and maybe completely unrelated to the things above but not
        to forget: When implementing this the code becomes more complex
        as exceptions thrown in key(), current(), rewind() have to be
        caught. With "classic" zend_hash iteration those operations will
        succeed if there was a next element pointer. Maybe that can be
        handled in a generic infrastructure, so we have less errors
        later.
        
johannes



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

Reply via email to