Ссылки

Последнее обновление: 02.05.2021

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850