причина, кажется, различные статьи, говорят разные вещи, в том, что они говорят о разных видах пройти по ссылке.
Главное, что определяет, является ли параметр должен быть передан по ссылке является сама функция подписи, и основы этого не изменились с 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 переменная по ссылке (как discussed in the manual here). Это немного затруднительно, так как на самом деле вам нужно поставить &
в два мест: в начале объявления функции, чтобы сказать, что 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 Engine, который использует PHP, использует метод «copy on write», чтобы оставить несколько переменных, которые имеют одинаковое значение, указывающее на одну и ту же часть памяти, даже если они не связаны как Рекомендации. Фактически, ссылочное задание обычно поражает этой оптимизацией из-за того, как двигатель отслеживает, какие переменные находятся в состоянии копирования на запись.
http://www.php.net/manual/en/language.references.pass.php –
«И начиная с PHP 5.4.0 удаленная ссылка на вызов была удалена, поэтому ее использование повысит фатальная ошибка ». –
@RUJordan «переадресация вызова времени» не является единственным видом передачи по ссылке. – IMSoP