2007/1/30, speedy <[EMAIL PROTECTED]>:
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.