Ссылки в PHP позволяют ссылаться на область памяти, где расположено значение переменной или параметра. Для создания ссылки перед переменной указывается символ амперсанда - &. Но перед рассмотрением ссылок сначала рассмотрим простой пример копирования переменных:
<?php $tom = "Tom"; $sam = $tom; $sam = "Sam"; echo "tom = $tom <br>"; // tom = Tom echo "sam = $sam"; // sam = Sam ?>
Здесь переменной $sam
присваивается значение переменной $tom
("Tom"). Затем той же переменной $sam
присваивается
новое значение - "Sam". Результат программы ожидаем - обе переменные имеют различные значения:
tom = Tom sam = Sam
Теперь при копировании значения переменных передадим ссылку:
<?php $tom = "Tom"; $sam = &$tom; // передача ссылки $sam = "Sam"; echo "tom = $tom <br>"; // tom = Sam echo "sam = $sam"; // sam = Sam ?>
Здесь нас интересует выражение
$sam = &$tom;
В данном случае переменной $sam
передается не копия значения переменной $tom
, как в предыдущем случае, а ссылка на область в памяти,
которую занимает переменная $tom
. То есть после выполнения инструкции
$sam = &$tom;
Обе переменных будут указывать на один и тот же адрес в памяти. Это приведет к тому, что изменение значения одной из этих переменных приведет к изменению значения другой переменной. Потому что они ссылаются на один и тот же участок в памяти и соответственно имеют одно общее значение:
tom = Sam sam = Sam
Присвоить ссылку на переменную можно двумя способами:
$sam = &$tom; // или так $sam = & $tom;
В примере в прошлых темах мы передавали параметры по значению. Но в PHP есть и другая форма передачи параметров - по ссылке. Рассмотрим два этих способа передачи параметров и сравним. Стандартная передача параметра по значению:
<?php function square($a) { $a *= $a; echo "a = $a"; } $number = 5; square($number); echo "<br />number = $number"; ?>
Результат программы:
a = 25 number = 5
В данном случае внутри функции square()
значение параметра $a
возводится в квадрат. То есть значение параметра внутри функции изменяется.
Однако после вызова функции square()
значение переменной $number
, которое передается параметру $a, не изменится.
Это и есть передача по значению, она никак не затрагивает переменную $number
.
Теперь рассмотрим передачу параметра по ссылке:
<?php function square(&$a) { $a *= $a; echo "a = $a"; } $number = 5; square($number); echo "<br />number = $number"; ?>
Результат программы:
a = 25 number = 25
При передаче по ссылке перед параметром ставится знак амперсанда: function square(&$a)
. Теперь интерпретатор будет передавать не
значение переменной, а ссылку на эту переменную в памяти. То есть теперь и переменная $number и параметр $a будут указывать на одну и ту же область в памяти.
В итоге, значение переменной $number
после передачи параметру &$a
также будет изменено.
Функция также может возвращать ссылку. В этом случае при определении и вызове функции перед ее именем ставится знак амперсанда:
<?php function &checkName(&$name) { if($name === "admin") $name = "Tom"; return $name; } $userName = "admin"; $checkedName = &checkName($userName); echo "<br />userName: $userName"; echo "<br />checkedName: $checkedName"; ?>
В данном случае функция checkName()
получает параметр по ссылке и возвращает ссылку - фактически ссылку, которая передается в функции. Для этого перед определением функции
указан символ амперсанда:
function &checkName(&$name)
Для имитации работы функция проверяет имя пользователя и изменяет его на некоторое стандартное, если оно равно "admin".
При вызове функции перед ее именем указывается символ амерсанда:
$checkedName = &checkName($userName)
После выполнения функции переменная $checkedName
фактически будет содержать ссылку на переменную $userName
.