См. Этот код:
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
.
Здесь символ &
означает, что переменная передается по ссылке , а не по значению . Разница между ними заключается в том, что если вы пройдете по ссылке, любые изменения, внесенные в переменную, также будут сделаны в оригинале.
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
При использовании амперсанда перед переменной в вызове функции он ассоциируется с самой исходной переменной. При этом код, который вы опубликовали, говорит, что он добавит 1 к счетчику исходного массива. Без амперсанда он берет копию данных и добавляет к ней, а затем возвращает новый счетчик 11. Старый массив все еще остается нетронутым в 10, а новая возвращаемая переменная счетчика превращается в 11.
http://www.phpreferencebook.com/samples/php-pass-by-reference/
является хорошим примером.
Может быть, я могу добавить к другим ответам, что если это объект, то это не «объект, переданный как значение», но он «ссылка объекта передается как значение» (хотя я спрашиваю, в чем разница между «объектом передается по ссылке» vs «ссылка объекта передается по значению» в комментариях). По умолчанию массив передается по значению.
Информация: Объекты и ссылки
Пример:
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