PDA

View Full Version : PHP references question


AndrewD
08-23-2008, 11:42 AM
I suspect I'm missing something very obvious here. Can someone explain the behaviour of this code:


<?php

$test = "12345";
$anothertest = "";
$yetanothertest = "";

function getref() {
global $test;
global $anothertest;
global $yetanothertest;

$anothertest =& $test;
$GLOBALS['yetanothertest'] =& $test;

echo "<br /><br />Inside<br />";
echo "test:".$test."<br />";
echo "anothertest:".$anothertest."<br />";
echo "yetanothertest:".$yetanothertest."<br />";
}

getref();

echo "<br /><br />Outside<br />";
echo "test:".$test."<br />";
echo "anothertest:".$anothertest."<br />";
echo "yetanothertest:".$yetanothertest."<br />";

echo "<br /><br />";

?>


which prints out

Inside
test:12345
anothertest:12345
yetanothertest:

Outside
test:12345
anothertest:
yetanothertest:12345

In other words, within the function, the reference assignment seems to have updated $anothertest but not $yetanothertest, yet having left the function, it's the other way round.

With direct assignments ($A = $B) instead of references ($A =& $B), both of the global variables are updated and correctly displayed inside and outside the function.

Guest190829
08-24-2008, 08:56 AM
What values were you expecting?


$GLOBALS['yetanothertest'] =& $test;


Assigns the global variable by to reference to the local variable to test; it's not affecting $yetanothertest in the local scope of the function.

and


$anothertest =& $test;


Is only affecting the reference of the local variable $anothertest...$anothertest does not have scope after the function call, however, if you assigned a value to the variables as you mentioned...it will affect all the variables that reference that data.

I know I'm not explaining it that well, there's a section in the PHP manual dedicated to explaining references over at php.net.

AndrewD
08-24-2008, 10:21 AM
What values were you expecting?

I was expecting $GLOBALS['abc'] to be identical to global $abc inside the function, and it isn't.

As you say, it's explained in the php help manual:

Warning
If you assign a reference to a variable declared global inside a function, the reference will be visible only inside the function. You can avoid this by using the $GLOBALS array. Think about global $var; as a shortcut to $var =& $GLOBALS['var'];. Thus assigning other reference to $var only changes the local variable's reference.

I didn't get that far on that page.