----- Original Message -----
From: "John" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, March 16, 2001 9:12 PM
Subject: Re: [PHP] Strange PHP Reference behaviour with globals
> Thanks Yasuo,
>
> That might explain why $gGlobal is not permanently set to 99,
> but that doesn't explain why $gGlobal is set to 55 in ChangeGlobalValue()
> permanently. So are you or am I missing something?
Reference in PHP is not actually a pointer. It's a common pithole for C/C++
programmers.
In C/C++, you will get 99, instead of 55. But we get 55 in PHP. Here is why.
Reference is just a place holder for a value.
Your code creates referece with "global" statement asI wrote in previous mail.
global $var;
creates reference to $GLOBAL['var'] for local $var IN function scope.
$var is actually a reference, NOT a variable itself nor a pointer.
> > > function ChangeGlobalRef()
> > > {
> > > global $gGlobal;
Creating reference here, for $GLOBAL['gGlobal'].
> > >
> > > $local = 99;
> > > $gGlobal = &$local;
You assign reference of "$local" to "$gGlobal" which is also a reference.
$gGlobal = &$local;
This replaces $gGlobal(reference) with $local(reference).
Your code does not change $GLOBAL['gGlobal'], which is the value you want to
change.
> > > print "Ref:Global=$gGlobal<BR>";
> > > }
Since your code replace reference with reference inside function scope.
You get $gGlobal = 99 inside the function, but not outside the function.
(Note: Your $gGlobal is refered to $local that has 99 in the function)
Because $gGlobal itself is local to the function.
Therefore, you cannot get 99 outside the function, but 55.
I hope I explained well, so that all readers understand what I'm talking about.
Regards,
--
Yasuo Ohgaki
> Bye, John
>
> ""Yasuo Ohgaki"" <[EMAIL PROTECTED]> wrote in message
> [EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> > This is expected behavior of PHP's reference. Reference works like a
> pointer,
> > but it dose NOT works like a pointer. This is case that reference does
> not
> > works as many programmer expected.
> >
> > I think this is in manual.
> >
> > Hint: when programmer use 'global $var'. It is the same as do '$var = &
> > $GLOBALS['var']'.
> >
> > Regards,
> >
> > Yasuo Ohgaki
> > =========================
> > My favorite links
> > [RFC] http://www.faqs.org/rfcs/ [W3C] http://www.w3.org/
> > [PHP Manual] http://www.php.net/manual/en/
> >
> > > Hello,
> > >
> > > Try the following code:
> > >
> > > <?php
> > >
> > > $gGlobal = 1;
> > > function ChangeGlobalValue()
> > > {
> > > global $gGlobal;
> > >
> > > $local = 55;
> > > $gGlobal = $local;
> > > print "Value:Global=$gGlobal<BR>";
> > > }
> > >
> > > function ChangeGlobalRef()
> > > {
> > > global $gGlobal;
> > >
> > > $local = 99;
> > > $gGlobal = &$local;
> > > print "Ref:Global=$gGlobal<BR>";
> > > }
> > >
> > > print "Global=$gGlobal<BR>";
> > > ChangeGlobalValue();
> > > print "Global=$gGlobal<BR>";
> > > ChangeGlobalRef();
> > > print "Global=$gGlobal<BR>";
> > > ?>
> > >
> > > I get the following results:
> > >
> > > Global=1
> > > Value:Global=55
> > > Global=55
> > > Ref:Global=99
> > > Global=55 <=========== shouldn't this be 99 ???
> > >
> > > Why does setting a global variable to a reference fail in a function?
> > >
> > > Tested on PHP 4.0.4 on IIS5 (CGI version).
> > >
> > >
> > >
> > >
> > > --
> > > PHP General Mailing List (http://www.php.net/)
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > To contact the list administrators, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> > --
> > PHP General Mailing List (http://www.php.net/)
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > To contact the list administrators, e-mail: [EMAIL PROTECTED]
> >
>
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> To contact the list administrators, e-mail: [EMAIL PROTECTED]
>
>
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]