ID: 39011 User updated by: php_bug dot email at email dot digiways dot com Reported By: php_bug dot email at email dot digiways dot com -Status: Bogus +Status: Open Bug Type: Arrays related Operating System: Windows XP PHP Version: 5.1.6 New Comment:
> And since all the elements in the array are references Are you talking about arrays in general, or about my example? If you are talking about arrays in general, this is simply wrong, a simple example can demostrate that. If you are talking about my example, then please explain why the element in the array becomes a reference if we add a reference to it? I.e. $a = array('foo' => 'bar'); here $a contains the value 'bar' and not the reference to it. $tmp = &$a['foo']; Are you saying that now $a has changed and now it contains a reference to 'bar' and does not contain it as a value any more? Where is this documented? Previous Comments: ------------------------------------------------------------------------ [2006-10-02 08:46:52] [EMAIL PROTECTED] >Documentation describes that parameters are passed to >functions by value by default. They are passed by value, including all the references in the array. And since all the elements in the array are references, you're able to modify them in the function. See var_dump($myarray); ------------------------------------------------------------------------ [2006-10-01 22:42:59] php_bug dot email at email dot digiways dot com Documentation describes that parameters are passed to functions by value by default. And since the behaviour you are talking about is not documented anywhere, it is definitely a bug. So, I suggest you read PHP documentation starting with http://www.php.net/manual/en/functions.arguments.php which clearly states: === By default, function arguments are passed by value (so that if you change the value of the argument within the function, it does not get changed outside of the function). If you wish to allow a function to modify its arguments, you must pass them by reference. === and then explain it again why the problem described above is not a bug although it does not do what PHP documentation states it does. ------------------------------------------------------------------------ [2006-10-01 22:34:35] judas dot iscariote at gmail dot com again, THIS IS NOT A BUG ยก! but yes,this behaviuor should be described in the documentation I think. I still think this kind of code should raise an E_WARNING or something ( the idea was proposed a while ago, but refused) ------------------------------------------------------------------------ [2006-10-01 22:12:20] plyrvt at mail dot ru 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" ------------------------------------------------------------------------ [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 ? ------------------------------------------------------------------------ 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