Полный цикл в digital

Ссылки

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

Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг