“&”运算符如何在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