On Fri, Jan 30, 2015 at 8:23 AM, Dmitry Stogov <dmi...@zend.com> wrote:

> Hi,
>
> I'd like to start discussion about fixing inconsistent "foreach" statement
> behavior.
> The implementation is almost done. It not only fixes inconsistencies in a
> defined by RFC way but also improves performance in most usual cases,
> because now foreach by value over array doesn't require array duplication.
>
> https://wiki.php.net/rfc/php7_foreach
>
> https://github.com/php/php-src/pull/1034
>
> I'm going to continue work on implementation improvement and may be fixing
> related behavior of some internal functions when they used on array
> iterated by foreach by reference (e.g. array_unshift()). However, the
> conceptual behavior defined in RFC is not going to be changed anymore.
>
> Thanks. Dmitry.
>

I think the new behavior introduced by this RFC is much more consistent
than what we have right now. Previously things depended on details of
refcounting and hashing and had very weird interaction with current() etc.
Now the behavior looks clear for all cases.

There's just one thing I'd like to discuss: The object by-value case:

Currently this is handled in much the same way as array by-reference, i.e.
changes to the object will influence iteration. Currently we can't
implement this any differently, however if we always use zend_array instead
of HashTable (and fully support refcounting for this), as has been
suggested in another thread, we could handle this case the same way as
arrays (i.e. just add a refcount to the properties zend_array). Assuming we
can implement it this way, I'm not totally sure which behavior makes more
sense. On one hand it would make arrays and plain objects work the same
way. On the other hand arrays and objects have different copying semantics
in other places as well.

Anyway, big +1 on this, thanks for implementing it.

Nikita

Reply via email to