Re: Unsetting loop variables at the end of the loop

From: Date: Sun, 27 Dec 2009 16:05:00 +0000
Subject: Re: Unsetting loop variables at the end of the loop
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-46529@lists.php.net to get a copy of this message
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 <mwacker@cornellsun.com> wrote: >> Adam Harvey wrote: >>> 2009/12/27 Mike Wacker <mwacker@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 >> >> >

« previous php.internals (#46529) next »