ID: 29686 Comment by: jakub dot phpbug at horky dot net Reported By: swalk at prp dot physik dot tu-darmstadt dot de Status: Open Bug Type: Scripting Engine problem Operating System: * PHP Version: 5.* New Comment:
Yes, sorry, now I see you are true. When I tested the example above I didn't try to comment out the line '$b =& $a;' so I thought the array is always using directly from foreach on each loop. So IMHO there is either badly written documentation or bad implementation (which is btw relevant to that two bugs I posted before). BUG UPDATE: Now I noticed that if you first unset() the $a variable before re-setting it to the string (or anything else), it is working properly. Previous Comments: ------------------------------------------------------------------------ [2004-08-15 15:44:12] [EMAIL PROTECTED] I don't use register globals. But there are lots of servers which do. 1st, you're contradicting the Documentation, which clearly states that the array should be copied: "Note: Also note that foreach operates on a copy of the specified array and not the array itself." 2nd, you didn't specify the difference between using a reference variable and a normal variable. If you do foreach($array as $v) { array_push($array, 0); } modifying the array, it doesn't affect the loop. By your reasoning, it should? Please don't bogus it again, because it is either a problem with the documentation or with the implementation. ------------------------------------------------------------------------ [2004-08-15 15:42:29] jakub dot phpbug at horky dot net Sorry for mistyping the bug numbers: bug #28939 and bug #29687 ------------------------------------------------------------------------ [2004-08-15 15:40:53] jakub dot phpbug at horky dot net To [EMAIL PROTECTED]: > especially the part with "Note: Also note > that foreach operates on a copy of the specified > array and not the array itself." Sorry, but that especially this paragraph is very obscure, because a subsequent sentence states "However, the internal pointer of the original array is advanced with the processing of the array." Furthermore, this is partially subject of recently opened bug #28939 or #28939. But there I really don't see any problem. Coincidental overwriting of registered global is IMO really not bug but stupidity of the author :-) ------------------------------------------------------------------------ [2004-08-15 15:27:49] [EMAIL PROTECTED] Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php Don't use register globals. And don't use it for example because of this problem. Second, a reference variable and a normal variable do NOT result in foreach copying the whole array. Instaed not accessing the data by ref [foreach($ar as &$data)] only results in copying the data. Therefor the array is still ste same and if you change the array in the loop then obviously you affect the loop. ------------------------------------------------------------------------ [2004-08-15 15:20:05] [EMAIL PROTECTED] Care to explain why doing $a =& $a; before the loop should affect the behaviour? In my (and some others whom i talked to) opinion that behaviour is bogus. And if it does make sense, it should be reflected in the documentation (where it isn't), because this caused someone an error with a high WTF factor in an application. Example: foreach ($_SESSION['something'] as $foo) { do_something; $something = "foo"; do_something_else; } Breaks on a server with register_globals on. ------------------------------------------------------------------------ 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/29686 -- Edit this bug report at http://bugs.php.net/?id=29686&edit=1