Как работает оператор «&» в функции PHP? - PullRequest
9 голосов
/ 18 октября 2010

Пожалуйста, смотрите этот код:

function addCounter(&$userInfoArray) {
    $userInfoArray['counter']++;
    return $userInfoArray['counter'];
}

$userInfoArray = array('id' => 'foo', 'name' => 'fooName', 'counter' => 10);
$nowCounter = addCounter($userInfoArray);

echo($userInfoArray['counter']);

Это покажет 11.

Но! Если вы удалите оператор «&» в параметре функции, результат будет 10.

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

Ответы [ 4 ]

32 голосов
/ 18 октября 2010

Оператор & говорит 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, с другой стороны, сделал.

6 голосов
/ 18 октября 2010

Здесь символ & означает, что переменная передается по ссылке , а не по значению . Разница между ними заключается в том, что если вы передадите по ссылке, любые изменения, внесенные в переменную, будут также сделаны и в оригинале.

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
2 голосов
/ 18 октября 2010

Может быть, я могу добавить к другим ответам, что если это объект, то это не «объект, переданный как значение», а «ссылка на объект, переданная как значение» (хотя я спрашиваю разница между "объектом передается по ссылке" против "ссылки на объект по значению" в комментариях). Массив передается по значению по умолчанию.

Информация: Объекты и ссылки

Пример:

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
2 голосов
/ 18 октября 2010

При использовании амперсанда перед переменной в вызове функции он связывается с самой исходной переменной. При этом код, который вы разместили, говорит, что он добавит 1 к счетчику исходного массива. Без амперсанда он берет копию данных и добавляет к ней, а затем возвращает новый счетчик, равный 11. Старый массив все еще остается неповрежденным в 10, а новая возвращаемая переменная счетчика превращается в 11.

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

хороший пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...