How does the “&” operator work in a PHP function?

后端 未结 4 2071
轮回少年
轮回少年 2020-11-28 11:42

Please see this code:

function addCounter(&$userInfoArray) {
    $userInfoArray[\'counter\']++;
    return $userInfoArray[\'counter\'];
}

$userInfoArray         


        
相关标签:
4条回答
  • 2020-11-28 11:58

    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.

    0 讨论(0)
  • 2020-11-28 11:58

    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 讨论(0)
  • 2020-11-28 12:16

    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
    
    0 讨论(0)
  • 2020-11-28 12:18

    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.

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

    is a good example.

    0 讨论(0)
提交回复
热议问题