On Mon, 16 Nov 2009, Mathieu Suen wrote:
> > > It would be arbitrarily breaking an explicit reference. I know I
> > > have code lying around that relies on multiple loops cleaning up a
> > > big complicated multi-level array. I do ugly things with
> > > references into that array and it would completely break if PHP
> > > magically deleted my references whether they are in the iterator
> > > or elsewhere.
> > >
> > > This has been this way for 6+ years and it is well documented on
> > > the http://php.net/foreach page. (see the big red warning box)
>
> Even though, that's a language issue. Why the hell in php the foreach
> do not capture the variable properly?
It *does* work properly. I will try to explain once more...
The following code:
<?php
$items = array('apple', 'banana', 'carrot');
print_r($items);
foreach ($items as &$item) { }
print_r($items);
foreach ($items as $item) { }
print_r($items);
?>
can be rolled out into:
<?php
$items = array('apple', 'banana', 'carrot');
print_r($items);
$item =& $items[0];
$item =& $items[1];
$item =& $items[2]; // line A
// $item now is the same var as $items[2];
print_r($items);
// $item still is the same as $items[2] as done in Line A, so $items[2] (and
// $item because it's the same variable) gets modified to 'apple'.
$item = $items[0];
// $item still is the same as $items[2] as done in Line A, so $items[2] (and
// $item because it's the same variable) gets modified to 'banana'.
$item = $items[1];
// $item still is the same as $items[2] as done in Line A, so $items[2] (and
// $item because it's the same variable) gets modified to 'banana' because it
// was assigned to this value in the line above.
$item = $items[2];
print_r($items);
?>
Does it makes sense now?
Derick
--
http://derickrethans.nl | http://ezcomponents.org | http://xdebug.org
twitter: @derickr
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php