Adam Harvey wrote:
2009/12/27 Mike Wacker <[email protected]>:
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.
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