12

Please see this code:

function addCounter(&$userInfoArray) {
    $userInfoArray['counter']++;
    return $userInfoArray['counter'];
}
$userInfoArray = array('id' => 'foo', 'name' => 'fooName', 'counter' => 10);
$nowCounter = addCounter($userInfoArray);
echo($userInfoArray['counter']);

This will show 11.

But! If you remove "&"operator in the function parameter, the result will be 10.

What's going on?

3
  • 2 perfect answers for only 3 mins! Are you guys all genious or something? or expecting me to ask this question. So surprised!
    – Deckard
    Commented Oct 18, 2010 at 8:44
  • (related) What does this symbol mean in PHP
    – Gordon
    Commented Oct 18, 2010 at 8:44
  • Oh...I tried to google it, but failed... So embarrasing..
    – Deckard
    Commented Oct 18, 2010 at 8:49

4 Answers 4

45

The & operator tells PHP not to copy the array when passing it to the function. Instead, a reference to the array is passed into the function, thus the function modifies the original array instead of a copy.

Just look at this minimal example:

<?php
function foo($a) { $a++; }
function bar(&$a) { $a++; }
$x = 1;
foo($x);
echo "$x\n";    
bar($x);
echo "$x\n";
?>

Here, the output is:

1
2

– the call to foo didn’t modify $x. The call to bar, on the other hand, did.

1
  • I know I am a little late on this - but thank you for this extremely clear answer that left nothing to question.
    – Michael
    Commented Aug 11, 2017 at 20:30
8

Here the & character means that the variable is passed by reference, instead of by value. The difference between the two is that if you pass by reference, any changes made to the variable are made to the original also.

function do_a_thing_v ($a) {
    $a = $a + 1;
}
$x = 5;
do_a_thing_v($x);
echo $x; // echoes 5
function do_a_thing_r (&$a) {
    $a = $a + 1;
}
$x = 5;
do_a_thing_v($x);
echo $x; // echoes 6
0
2

When using the ampersand prior to a variable in a function call, it associates with the original variable itself. With that, the code you posted is saying that it will add 1 to the counter of the original array. Without the ampersand, it takes a copy of the data and adds to it, then returns the new counter of 11. The old array still remains intact at 10 and the new counter variable returned turns into 11.

https://www.phpreferencebook.com/samples/php-pass-by-reference/

is a good example.

0
2

Maybe I can add to the other answers that, if it is an object, then it is not "the object passed as value", but it is "the object's reference is passed as a value" (although I am asking what the difference is between "the object is passed by reference" vs "the object's reference is passed by value" in the comments). An array is passed by value by default.

Information: Objects and references

Example:

class Foo {
    public $a = 10;
}
function add($obj) {
    $obj->a++;
}
$foo = new Foo();
echo $foo->a, "\n";
add($foo);
echo $foo->a, "\n";

Result:

$ php try.php
10
11
4
  • Thank you another Mr.Genious.
    – Deckard
    Commented Oct 18, 2010 at 8:59
  • 1
    This is a common mistake. Objects are not passed by reference. Rather, their reference is passed by value. This is a crucial difference! Try modifying the reference itself, rather than an instance member (i.e. write $obj = new Foo() inside the method). Ironically, the page you linked even says that your quote isn’t true! So you must have known that you wrote something false. Commented Oct 18, 2010 at 9:00
  • if it is passed by reference, vs if its reference is passed by value, if $obj = new Foo() inside the method, are the results just the same? i.e. when print out one more time, it is still 11. Commented Oct 18, 2010 at 9:09
  • since it is a separate item, how about discussing in stackoverflow.com/questions/3957801/… Commented Oct 18, 2010 at 9:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.