We can't just randomly reset variables based on their scope in this one
specific case.  If we are going to "fix" this, it should be done by
introducing a way to do proper local scope variables.  Resetting a
reference simply because it is convenient in this one case would be
completely inconsistent.

-Rasmus

Ferenc Kovacs wrote:
> 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