Ссылки
Ссылки в 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
Теперь при копировании значения переменных передадим ссылку:
<?
$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 есть и другая форма передачи параметров, по ссылке
. Рассмотрим два этих способа передачи параметров и сравним.
Передача параметров по значению в функцию
Любой параметр который передается в функцию, не меняет значение при выходе из функции. При передаче параметра в функцию, создается копия этого параметра и внутри функции мы работаем с копией параметра.
<?
// объявляем функцию
function SetValue($x)
{
$x = 10;
}
// создаем переменную
$a = 20;
// вызываем функцию
SetValue($a);
// увидим на экране 20
print($a);
Передача параметров по ссылке в функцию
Чтобы передать параметр в функцию по ссылке нужно использовать &
. При передаче параметра в функцию по ссылке, такой параметр передается внутрь функции и мы работаем с этим параметром. При выходе из функции параметр меняет значение.
<?
// объявляем функцию
function SetValue(&$x)
{
$x = 10;
}
// создаем переменную
$a = 20;
// вызываем функцию
SetValue($a);
// увидим на экране 10
print($a);
При передаче по ссылке перед параметром ставится знак амперсанда: function SetValue(&$x)
. Теперь интерпретатор будет передавать не значение переменной, а ссылку на эту переменную в памяти. То есть теперь и переменная $a
и параметр $x
будут указывать на одну и ту же область в памяти.
Возвращение ссылки из функции
Функция также может возвращать ссылку. В этом случае при определении и вызове функции перед ее именем ставится знак амперсанда:
<?
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
.