Похоже, что разные статьи говорят о том, что они говорят о разных видах прохождения.
Главное, что определяет, должен ли параметр быть передан с помощью ссылки, - это сама подпись функции, и основы этого не изменились с момента PHP 4. Рассмотрим этот пример:
function foo( $by_value, &$by_reference ) { /* ... */ }
$a = 1; $b = 2;
foo( $a, $b );
Здесь внешняя переменная $a
передается функции по значению, как будто она назначается как $by_value = $a;
- изменения в $by_value
не может повлиять $a
. Анкет Переменная $b
Однако проходит по ссылке; точно так же, как задание формы $by_reference =& $b;
Это означает, что есть одна переменная, на которую ссылается два имена, и любое назначение одному будет выступать в качестве назначения обоим.
Если вы передаете «обычное» значение (строка, число или массив) по значению, его значение просто скопируется в новую переменную. По состоянию на Php 5: Однако, если вы передаете объект по значению, происходит что -то немного другое - скопированное «значение» - это просто указатель на один и тот же объект. Это означает, что если $a
были объектом, вы могли бы позвонить $by_value->some_property = 42;
а также $a->some_property
также будет 42
. Анкет Однако, если вы назначили новое значение $by_value
, это все равно не повлияет $a
.
До PHP 5.4, это был дополнительный Способ пройти параметр по ссылке, который должен был «заставить» справочное поведение во время вызова. Анкет Это означало, что вы могли бы написать foo(&$a, &$b);
и «захват» изменения, внесенные в $by_value
внутри foo()
функция Полагаться на это было в целом плохой идеей, и поэтому она была удалена. (Он приземлился в 5,4, потому что он был предназначен для удаления в PHP 6, но этот проект был поставлен на неопределенное удержание, причем меньшие изменения приземлялись в 5,3 и 5,4).
Наконец, функции могут возвращаться переменная по ссылке (как обсуждается в руководстве здесь) Это немного жестко, так как это действительно требует от вас, чтобы положить &
в два Места: в начале объявления функции, чтобы сказать, что return
должен означать «вернуть эту ссылку на переменную», а не «вернуть это значение»; и в коде вызове его, чтобы назначить переменную этой ссылке, а не просто копировать ее значение. Вот глупый пример, который объединяет эталонный параметр с возвратом ссылки (эти два не должны идти вместе, это просто пример):
function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable,
// but all those operations were by reference
Обратите внимание, что многие люди по ошибке считают, что передача переменной по ссылке даст им выгоду от производительности, и это часто было их единственной причиной для использования времени вызовов. На самом деле это обычно неправильно, так как двигатель Zend, который Ph использованная литература. Фактически, ориентировочное назначение в целом поражения Эта оптимизация из-за того, как двигатель отслеживает, какие переменные находятся в состоянии копии на записи.