Поиск…


Синтаксис

  • $foo = 1; $bar = &$foo; // both $foo and $bar point to the same value: 1
  • $var = 1; function calc(&$var) { $var *= 15; } calc($var); echo $var;

замечания

При назначении двух переменных по ссылке обе переменные указывают на одно и то же значение. Возьмем следующий пример:

$foo = 1;
$bar = &$foo;

$foo не указывает на $bar . $foo и $bar указывают на то же значение $foo , которое равно 1 . Проиллюстрировать:

$baz = &$bar;
unset($bar);
$baz++;

Если бы у нас были points to отношениям, это было бы нарушено теперь после unset() ; вместо этого $foo и $baz все же указывают на то же значение, которое равно 2 .

Назначить по ссылке

Это первая фаза ссылок. По существу, когда вы назначаете по ссылке , вы позволяете двум переменным совместно использовать одно и то же значение.

$foo = &$bar;

Здесь равны $foo и $bar . Они не указывают друг на друга. Они указывают на одно и то же место ( «значение» ).


Вы также можете назначить по ссылке в конструкции языка array() . Хотя это не строгое назначение по ссылке.

$foo = 'hi';
$bar = array(1, 2);
$array = array(&$foo, &$bar[0]);

Однако обратите внимание , что ссылки внутри массивов потенциально опасны. Выполнение нормального (не по ссылке) присваивания с помощью ссылки с правой стороны не превращает левую сторону в ссылку, но ссылки внутри массивов сохраняются в этих нормальных назначениях. Это также относится к вызовам функций, где массив передается по значению.

Присвоение по ссылке не ограничивается только переменными и массивами, они также присутствуют для функций и всех ассоциаций «pass-by-reference».

function incrementArray(&$arr) {
    foreach ($arr as &$val) {
        $val++;
    }
}

function &getArray() {
    static $arr = [1, 2, 3];
    return $arr;
}

incrementArray(getArray());
var_dump(getArray()); // prints an array [2, 3, 4]

Назначение является ключевым в определении функции, как указано выше. Вы не можете передать выражение по ссылке, только значение / переменная. Следовательно, экземпляр $a в bar() .

Возвращение по ссылке

Иногда наступает время, когда вы неявно возвращаетесь к ссылке.

Возвращение по ссылке полезно, когда вы хотите использовать функцию, чтобы найти, к какой переменной привязка должна быть привязана. Не используйте обратную ссылку для увеличения производительности. Двигатель автоматически оптимизирует это самостоятельно. Возвращайте ссылки только тогда, когда у вас есть веская техническая причина.

Взято из документации PHP для возврата по ссылке .

Существует много разных форм возврата по ссылке, включая следующий пример:

function parent(&$var) {
    echo $var;
    $var = "updated";
}

function &child() {
    static $a = "test";
    return $a;
}

parent(child()); // returns "test"
parent(child()); // returns "updated"

Возврат по ссылке не ограничивается ссылками на функции. У вас также есть возможность неявно вызвать функцию:

function &myFunction() {
    static $a = 'foo';
    return $a;
}

$bar = &myFunction();
$bar = "updated"
echo myFunction();

Вы не можете напрямую ссылаться на вызов функции, она должна быть назначена переменной перед ее использованием. Чтобы увидеть, как это работает, просто попробуйте echo &myFunction(); ,


Заметки

  • Вы должны указать ссылку ( & ) в обоих местах, которые вы собираетесь использовать. Это означает, что для определения функции ( function &myFunction() {... ) и в вызывающей ссылке ( function callFunction(&$variable) {... или &myFunction(); ).
  • Вы можете возвращать переменную только по ссылке. Следовательно, экземпляр $a в приведенном выше примере. Это означает, что вы не можете вернуть выражение, иначе будет генерироваться ошибка E_NOTICE PHP ( Notice: Only variable references should be returned by reference in ...... ).
  • Возвращение по ссылке имеет законные варианты использования, но я должен предупредить, что их следует использовать экономно, только после изучения всех других возможных вариантов достижения одной и той же цели.

Пропустить по ссылке

Это позволяет передавать переменную по ссылке на функцию или элемент, который позволяет изменять исходную переменную.

Передача по ссылке не ограничивается только переменными, следующее может также передаваться по ссылке:

  • Новые утверждения, например foo(new SomeClass)
  • Ссылки, возвращаемые функциями

Массивы

Обычное использование «передачи по ссылке» заключается в изменении начальных значений в массиве без необходимости создания новых массивов или засорения вашего пространства имен. Передача по ссылке так же проста, как предыдущая / префиксная переменная с помощью & => &$myElement .

Ниже приведен пример использования элемента из массива и просто добавление 1 к его начальному значению.

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

Теперь, когда вы используете какой-либо элемент в $arr , исходный элемент будет обновляться по мере увеличения ссылки. Вы можете проверить это:

print_r($arr);

Заметка

Вы должны обратить внимание при использовании прохода по ссылке в цикле. В конце вышеприведенного цикла $num все еще содержит ссылку на последний элемент массива. Назначение этого цикла post приведет к обработке последнего элемента массива! Вы можете убедиться, что это не происходит, если unset() «после него»:

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

Вышеупомянутое гарантирует, что вы не столкнетесь с какими-либо проблемами. Пример проблем, которые могут быть связаны с этим, присутствует в этом вопросе в StackOverflow .


функции

Еще одно распространенное использование для передачи по ссылке - это функции. Изменение исходной переменной так же просто, как:

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

Который может быть проверен echo исходной переменной.

echo $var;

Существуют различные ограничения по функциям, как указано ниже в документах PHP:

Примечание. В вызове функции нет ссылочного знака - только для определения функций. Определений функций достаточно, чтобы правильно передать аргумент по ссылке. Начиная с PHP 5.3.0, вы получите предупреждение о том, что «call-time-pass-by-reference» устарело, когда вы используете & in foo (& $ a) ;. А с PHP 5.4.0 удаленный вызов был удален, поэтому его использование приведет к фатальной ошибке.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow