Как работает оператор «&» в функции 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.

Что происходит?

Related of "Как работает оператор «&» в функции PHP?"

Оператор & сообщает 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