Ссылки в 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.