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

请看这个代码:

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

这将显示11。

但! 如果在函数参数中删除“&”运算符,结果将是10。

这是怎么回事?

&运算符告诉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

这里的&表示variables是通过引用传递 ,而不是通过值传递 。 两者之间的区别在于,如果您通过引用传递,则对该variables所做的任何更改也会发送给原始。

 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 

当在函数调用中的variables之前使用&符号时,它与原始variables本身相关联。 这样,你发布的代码就是说它会把原始数组的计数器加1。 如果没有符号,它将获取数据的一个副本并添加到它,然后返回11的新计数器。旧数组在10保持不变,新计数器variables返回到11。

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

就是一个很好的例子。

也许我可以添加到其他答案,如果它是一个对象,那么它不是“作为值传递的对象”,但它是“对象的引用传递为一个值”(虽然我问是什么区别之间的“对象是通过引用传递”与“对象的引用通过价值”在评论)。 数组默认情况下是按值传递的。

信息: 对象和参考

例:

 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