2007/1/30, speedy <speedy.spam@xxxxxxxxx>:
Hello Martin, > Tuesday, January 30, 2007, 8:45:50 PM, you wrote: > > function f() > { > global $arr; > > foreach($arr as $k=>$v) { > $v->do_something(); > } > } > > I don't see your point anywhere... foreach iterates over a copy of > the array so where is the potential side-effect? Even so there will > be references if the items of the original array are references, or > if they are objects in PHP5, but that's expected behaviour. That's > the way many OOP languages have been implemented (eg: Java) without > coders having the problems you mention. Just give me one good > reason to even consider your proposal. Humm, you seem to have misunderstood (& that could be one reason in itself). In my example foreach() iterates over the original $arr array (contrary to what you say) - and so may deeply nested fns in the called do_something() method, making global + foreach construct unuseable/"unstable" in non-trivial cases.
Damn, I hate localized documentation. The spanish manual isn't updated to what foreach does in the latest PHP5, and I didn't bother to check the english version. Foreach uses a copy only if the array is not a reference, and that's why you have that problem. There is nothing wrong with the global keyword, just use $GLOBAL['arr'] instead to avoid the reference, or create a copy by assignment. Anyway, I couldn't find this change of behaviour in the foreach in the changelog, but it seems it have been introduced around may 2005. Maybe is too late to complain, but, now that I know, I think this behaviour doesn't seem right.