ID:               39011
 Comment by:       plyrvt at mail dot ru
 Reported By:      php_bug dot email at email dot digiways dot com
 Status:           Open
 Bug Type:         Arrays related
 Operating System: Windows XP
 PHP Version:      5.1.6
 New Comment:

This bug can be described shortly:
"Existance of a reference to the element of an array prevents this
element to be passed by value as long as any reference point to it"


Previous Comments:
------------------------------------------------------------------------

[2006-10-01 22:02:06] php_bug dot email at email dot digiways dot com

Actually this is not just about foreach, this is the generic problem
with references.
Apparently if you have a reference to an array element, then when you
pass that array to a function and modify that element in the function,
then the external array is modified as well, and not just the copy
passed to the function.

A small example which shows the problem:
        $myarray = array( 'mykey' => 'foo' );
        function doit($tmp) { $tmp['mykey'] = 'bar'; }
        $value = &$myarray['mykey'];
        echo $myarray['mykey']."\n";
        doit($myarray);
        echo $myarray['mykey']."\n";

Once again - can anyone point to the documentation page which explains
this behaviour ?

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

[2006-10-01 21:55:23] plyrvt at mail dot ru

If you add unset($val) after foreach, original array starts back to
work as expected:

<?php
$a['b']='foo';
function boo($_params){
        $_params['b'] = 'bar';
        echo $_params['b'];
}

foreach($a as $key => &$val) {}
unset($val);

        echo $a['b'];
        boo($a);
        echo $a['b'];
/*
foo
bar
foo
*/
?>

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

[2006-10-01 21:39:58] plyrvt at mail dot ru

Confirm with 5.1.6:
<?php
$a['b']='foo';
function boo($_params){
        $_params['b'] = 'bar';
        echo $a['b'];
}

foreach($a as $key => &$val) {} // ?!

        echo $a['b'];
        boo($a);
        echo $a['b'];
?>

If you comment out `foreach` loop or remove & near `$val`, code works
OK. Loop does nothing and $val is *never* mentioned in code elsewhere.

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

[2006-10-01 21:37:06] php_bug dot email at email dot digiways dot com

This problem affects all the arrays and not just the $_GET one. Please
note that $value is not reused outside of the foreach loop. Effectively
this renders foreach by reference useless.

Another very simple script which reproduces the problem:

        $myarray = array( 'mykey' => 'foo' );
        function doit($tmp) { $tmp['mykey'] = 'bar'; }
        foreach($myarray as $key => &$value) {}
        echo $myarray['mykey']."\n";
        doit($myarray);
        echo $myarray['mykey']."\n";

and outputs
   foo
   bar
instead of
   foo
   foo

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

[2006-10-01 21:00:11] php_bug dot email at email dot digiways dot com

Where exactly is this behaviour documented? Can you point to the
documentation page as I failed to find this.

Also, another defect http://bugs.php.net/bug.php?id=29992 which was
referenced here is a different problem. In my case I do not reuse the
reference variable $value .

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

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
    http://bugs.php.net/39011

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

Reply via email to