В этом уроке мы изучим ссылки. Эта тема немного своеобразная: механизм ссылок напрямую используется редко.
Но это все равно важная тема. Когда мы начнем использовать массивы и объекты, нам понадобится понимание того, как ссылки работают.
Не относитесь к этому материалу слишком серьезно. Главное — уловить концепцию и знать само понятие, все остальное по необходимости.
Ссылки в PHP — это средство доступа к содержимому одной переменной под разными именами.
Так работает доступ без ссылок:
<?php
$a = 5;
$b = $a;
$a = 3;
echo $b; // => 5
А теперь попробуем использовать ссылки:
<?php
$a = 5;
$b =& $a;
$a = 3;
echo $b; // => 3
Запись =&
говорит, что переменная слева начинает указывать на те же данные, что и переменная в правой части выражения.
Здесь стоит сказать: если вы запомнили переменные как коробочки, которые содержат внутри себя данные, то это не совсем верная аналогия. На самом деле, данные хранятся отдельно, а переменные — отдельно. Поэтому правильно говорить, что переменные ссылаются на свои данные.
Рассмотрим первую ситуацию подробнее:
<?php
$a = 5;
$b = $a;
В этом коде переменная $a
связывается с числом 5
. Затем мы выполняем присвоение $b = $a
. Несмотря на то, что справа стоит $a
, правильно этот код воспринимать как $b = 5
. Другими словами, вместо $a
подставляется ее значение, которое становится значением $b
.
Эти переменные не имеют между собой ничего общего, они не ссылаются на одни и те же данные. Это может показаться странным, ведь и там, и там записано одно и то же. Но это не так — у каждой переменной своя собственная пятерка.
Но все меняется, если во время присвоения добавить амперсанд: $b =& $a
. Теперь $b
и $a
ссылаются на одно и то же значение. Если поменять его в $b
, то оно поменяется и для $a
. Обратное тоже верно. $a
и $b
здесь абсолютно эквивалентны, но это не означает, что $a
указывает на $b
, или наоборот. Это означает, что $a
и $b
указывают на одно и то же значение.
Вероятно, сейчас вы чувствуете легкое замешательство. Если это так — не переживайте, это нормально. Тема ссылок — вещь, которую сложно понять и прочувствовать, прочитав один урок.
Есть три основных операции с использованием ссылок:
- Присвоение по ссылке
- Передача по ссылке
- Возврат по ссылке
Выше мы рассматривали довольно искусственные примеры. Практически единственное место, где ссылки встречаются в реальной жизни — аргументы функций, причем встроенные в сам язык. В основном это касается массивов, с которыми мы познакомимся позже. А пока посмотрим на этот прием без них:
<?php
// Либо так: function strangeFunction(&$text)
function strangeFunction(string &$text)
{
$text = 'hei';
}
$text = 'money';
strangeFunction($text);
echo $text; // => hei
В этом примере сама функция декларирует, что ее аргумент передается по ссылке. Самое неприятное — вы об этом даже не узнаете, если внимательно не прочитаете документацию. Обычно такие функции ничего не возвращают, они меняют аргументы, что, кстати, считается плохой практикой. Подобное поведение имеет смысл только в некоторых ситуациях, где крайне важна производительность — например, при сортировке массивов.
Особняком стоят объекты, которые всегда передаются по ссылке. Об этом рассказывается в следующих курсах.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты