PHP & Ampersand: Passing by Reference

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!

Similar Posts:

3 thoughts on “PHP & Ampersand: Passing by Reference”

  1. As Scott said, passing a reference in from the call will work, but it has been deprecated, so the following form is preferred:

    function add(&$var){ // The & is before the argument $var
    $var++;
    }
  2. 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:

       var1 = 0;
       var2 = 100;
     
       // changes var 1 to 5!   
       callMe(&var1, var2);
     
       function callMe(param1, param2) {
          param1 = 5;
       }

Comments are closed.