代码之家  ›  专栏  ›  技术社区  ›  Deckard

在PHP函数中“&”运算符是如何工作的?

php
  •  9
  • Deckard  · 技术社区  · 14 年前

    请参阅此代码:

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

    这将显示11。

    但是!如果删除函数参数中的“&operator”,结果将为10。

    发生什么事?

    4 回复  |  直到 7 年前
        1
  •  31
  •   Konrad Rudolph    14 年前

    这个 & 运算符告诉PHP在将数组传递给函数时不要复制数组。取而代之的是 参考 到数组被传递到函数中,因此该函数修改原始数组而不是副本。

    看看这个最小的例子:

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

    在这里,输出是:

    1
    2
    

    呼唤 foo 未修改 $x . 呼唤 bar 另一方面,是的。

        2
  •  6
  •   Hammerite    14 年前

    这里 & 字符表示变量被传递 参照 而不是 按价值 . 两者的区别在于,如果通过引用传递,对变量所做的任何更改也将对原始变量进行更改。

    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
    
        3
  •  2
  •   pyr0    14 年前

    在函数调用中使用变量之前使用和号时,它将与原始变量本身关联。这样,您发布的代码就表示它将向原始数组的计数器中添加1。如果不使用与号,它将获取数据的副本并将其添加,然后返回11的新计数器。旧数组在10处仍然保持不变,返回的新计数器变量变为11。

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

    是个很好的例子。

        4
  •  2
  •   Peter Mortensen nickfox    9 年前

    也许我可以加上其他的答案,如果它是一个对象,那么它不是“作为值传递的对象”,而是“作为值传递对象的引用”(尽管我在问注释中“通过引用传递对象”与“通过值传递对象的引用”之间的区别)。默认情况下,数组是按值传递的。

    信息: Objects and references

    例子:

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

    结果:

    $ php try.php
    10
    11