Bug #63179 [Dup]: foreach: Using variable reference leads to inconsistent data

From: Date: Sat, 29 Sep 2012 11:11:32 +0000
Subject: Bug #63179 [Dup]: foreach: Using variable reference leads to inconsistent data
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-173800@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=63179&edit=1

 ID:                 63179
 User updated by:    uli dot staerk at globalways dot net
 Reported by:        uli dot staerk at globalways dot net
 Summary:            foreach: Using variable reference leads to
                     inconsistent data
 Status:             Duplicate
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Linux
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

Thanks for pointing this out. I think breaking the reference is not the correct way, because an
implicit unset will also have to applied to variables and will break peoples code.

I think the correct way you should fix this, is by calling an implicit unset for $key and $value
when BEFORE foreach and should not break any code. If you think you are breaking code, you can issue
a E_WARNING if $value is a reference being destroyed.

Can you convert this bug report into some kind of feature request? :)


Previous Comments:
------------------------------------------------------------------------
[2012-09-29 11:06:57] notzippy at gmail dot com

I agree that this behaviour should be modified to a special case, with an automatic unset occurring
at the initialization of the second loop, or at the block closure of the first loop. If you read the
recommended practises it is highly recommended that this is done manually after closure of the
foreach loop. I would propose that this be changed to an automatic process.

------------------------------------------------------------------------
[2012-09-29 10:46:10] nikic@php.net

@uli: Maybe it would help you to understand the behavior if you wrote those two foreach loops out.
Your code is roughly equivalent to the following:

<?php
// first loop
$value =& $testdata[0];
$value =& $testdata[1];
// second loop
$value = $testdata[0];
$value = $testdata[1];

So after the second loop $value is a reference to $testdata[1]. You could say that those two
variables are synonyms. So when in the second loop you assign to $value again it is still a
reference to $testdata[1]. So if you change $value, then $testdata[1] is changed too.

Personally I think that we should break the reference after the foreach loop, simply to avoid the
WTF moment here. I just wanted to explain why the current behavior is consistent ;)

------------------------------------------------------------------------
[2012-09-29 09:38:22] uli dot staerk at globalways dot net

The manual says: "On each iteration, the value of the current element is assigned to
$value". 

This is not correct if you have a look at my example. The manual claims that an assignment happens,
but the reference has some magic override here.

Either you must fix this "consistent" implementation, or you have to fix the documentation
like "it will not be correctly assigned if $value is a reference".

------------------------------------------------------------------------
[2012-09-29 02:52:29] laruence@php.net

dup to #50485

------------------------------------------------------------------------
[2012-09-28 21:26:52] notzippy at gmail dot com

A variable that is the target of a foreach should be intrinsically unset and not need a manual
process to do it.

------------------------------------------------------------------------


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=63179


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=63179&edit=1


Thread (7 messages)

« previous php.bugs (#173800) next »