Bug #29992 [Com]: foreach by reference corrupts the array
| From: | robbie at shapehq dot co dot uk | Date: | Thu, 09 Feb 2012 12:33:40 +0000 |
| Subject: | Bug #29992 [Com]: foreach by reference corrupts the array | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-167343@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=29992&edit=1
ID: 29992
Comment by: robbie at shapehq dot co dot uk
Reported by: fletch at pobox dot com
Summary: foreach by reference corrupts the array
Status: Not a bug
Type: Bug
Package: Scripting Engine problem
Operating System: linux
PHP Version: 5.0.1
Block user comment: N
Private report: N
New Comment:
I feel very strongly that this behavior is wrong. It's not consistent with other languages and
will cause great confusion!
Previous Comments:
------------------------------------------------------------------------
[2011-10-20 04:56:50] bruce at kaskubar dot com
With all due respect to those who spend their time developing, debugging, and explaining PHP,
BALDERDASH!
Elsewhere, those of us who continue to claim "bug" are supposed to be chastened by all the
explanations that have been provided over the years. The fact that the reports persist and the
explanations grow is evidence contrary to the finding of Bogus and in support of what is expected
behavior.
Fletch's example, for example, is real and reproducible through at least v5.3.2.
How in the world can it be expected for a (second) loop and its object to perform as though no
related instructions were executed previously, and then for that interaction to raise its ugly head
for only the last iteration? It cannot be. It can be explained. But so can an earthquake be. That
doesn't make it expected.
I am unaware of any other case where prior use of a variable affects subsequent use of the
same-named variable where its value is being explicitly reset or, as in the case of foreach,
implicitly reset by virtue of its purpose. (That is, we can use $i as a loop counter here and as a
file handle there and as long as we don't cross their purposes in the space-time continuum, all
is well.)
The only bogus thing about this bug report and all its cousins is their shared status.
------------------------------------------------------------------------
[2011-09-02 15:13:42] publcishady at gmail dot com
If you describe how it works that's not an excuse for unexpected results. I understand why the
last element becomes a reference, but I don't understand why it SHOULD become a reference.
That's obviously a bug for me.
------------------------------------------------------------------------
[2011-07-18 05:03:24] martijn at twotribes dot com
Well, it is expected by the people who designed the language perhaps, but not by me. Iterating
through an array, without doing anything, shouldn't change the array. Period. If I do something
similar in another language like C++, this will never be the result.
------------------------------------------------------------------------
[2011-07-15 11:57:04] johannes@php.net
daniel,
unsetting it before might also cause a wrong result. Simple example:
<?php
function search_element($array, &$var) {
foreach ($array as &$var) {
if ($condition) {
return true;
}
}
}
$array=array(1,2,3,4,5,6);
$var = null;
search_element($array, $var);
?>
This is simplified and probably no good architecture but such designs might make sense in some
situations and breaking that adds a larger inconsistency than the current "surprising but
consistent" behavior.
martijn,
Of course there is a reference at the end, absolutely expected and consistent with the language.
------------------------------------------------------------------------
[2011-07-13 06:48:49] martijn at twotribes dot com
To elaborate of why I strongly feel this is a bug and not a 'feature':
$a = array('a', 'b', 'c', 'd');
foreach ($a as &$v) { }
var_dump($a);
One would expect that every element of $a is a string. Well it was, up until I did that
foreach-with-reference. That changed the last element into string reference:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
&string(1) "d"
}
The PHP guys can claim that this is correct behavior all they want, but it is fundamentally wrong
from a design perspective that an array changes, without doing anything to its elements.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=29992
--
Edit this bug report at https://bugs.php.net/bug.php?id=29992&edit=1