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