The following PHP Reference excerpt is from pages 20-21.
& – Pass by Reference
References allow two variables to refer to the same content. In other words, a variable points to its content (rather than becoming that content). Passing by reference allows two variables to point to the same content under different names. The ampersand ( & ) is placed before the variable to be referenced.
Examples:
$a = 1; $b = &$a; // $b references the same value as $a, currently 1 $b = $b + 1; // 1 is added to $b, which effects $a the same way echo "b is equal to $b, and a is equal to $a"; |
b is equal to 2, and a is equal to 2
Use this for functions when you wish to simply alter the original variable and return it again to the same variable name with its new value assigned.
function add(&$var){ // The & is before the argument $var $var++; } $a = 1; $b = 10; add($a); echo "a is $a,"; add($b); echo " a is $a, and b is $b"; // Note: $a and $b are NOT referenced |
a is 2, a is 2, and b is 11
You can also do this to alter an array with foreach:
$array = array(1,2,3,4); foreach ($array as &$value){ $value = $value + 10; } unset ($value); // Must be included, $value remains after foreach loop print_r($array); |
Array ( [0] => 11 [1] => 12 [2] => 13 [3] => 14 )
What tricks do you have for using the ampersand in PHP to pass by reference?
Leave them in the comments below!
Brandon is right! As of PHP 5.3.0, you will get a warning saying that “call-time pass-by-reference” is deprecated when you use & in $foo->setBar(“xxx”).
Besides objects are passed by reference by default.
Read here:http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
As Scott said, passing a reference in from the call will work, but it has been deprecated, so the following form is preferred:
In addition to prepending a function parameter with an ampersand, the ampersand may also be prepended to the variable in the calling statement, and the same effect will be achieved.
Not sure if this is a language quirk, or it was intended that way, but it works!
ex: