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