On Sun, Dec 27, 2009 at 3:11 PM, Mike Wacker <mwac...@cornellsun.com> wrote:
> Adam Harvey wrote:
>>
>> 2009/12/27 Mike Wacker <mwac...@cornellsun.com>:
>>>
>>> PHP's documentation for foreach states that if you iterate by reference
>>> [foreach ($ii as &$i) ...], you should unset $i after the loop.  $i still
>>> points to the last element of the array - updating $i or reusing it will
>>> update the last element of the array.
>>>
>>> In short, why doesn't PHP automatically unset $i after the loop?  I can't
>>> think of too many cases where you would want to hold on to that reference
>>> after you exit the loop, but I can think of a lot of scenarios where a
>>> user
>>> could accidentally tamper the array by using $i in a different context
>>> later
>>> on (especially since loop variable names often are reused).
>>
>> This is a bit of a FAQ, frankly. May I suggest reading this thread
>> from a couple of months ago:
>> http://marc.info/?l=php-internals&m=125617546815934&w=2. There are
>> some more discussions both on the list and in the bug tracker if you
>> want to have a bit more of a dig into this.
>
> Ah, so it seems that "reference" was the keyword I was missing in my search
> queries for the bug database.  It looks like I may have (re)opened a can of
> worms.
>
>> The really, really short version is that it would break backward
>> compatibility to change it now,
>
> I would agree that if this did change, it would have to change in PHP 6 and
> not 5.2/3.
>
I would like to see this change in PHP6. :)
>> it's useful in some (admittedly limited) cases,
>
> The main problem I see is that, like you said, these cases are limited.  If
> you really need to hold on to a reference after the loop, then why not make
> an explicit reference?
>
> foreach ($ii as &$i) {
>  $j =$ $i;
>  // loop body
> } // PHP implicitly unset()'s $i
>
> In both this case and the status quo, someone has to add an extra line of
> code for every loop.  Since re-using a loop variable is a much more common
> use case, I feel that PHP should accommodate that use case and force people
> using references outside the loop to add the line of code instead.
>
>> and it's not as though it's not well documented as behaving that way.
>>
>> Adam
>
> True, but it may not hurt to make the documentation more explicit to catch
> the most common use case.  You could add this clause: ", especially if
> $value is used elsewhere as a loop variable again." (Though should I maybe
> move this part into the doc newsgroup?)
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

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

Reply via email to