Полный цикл в 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 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.

Теперь рассмотрим передачу параметра по ссылке:

<?
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 также будет изменено.

Возвращение ссылки из функции

Функция также может возвращать ссылку. В этом случае при определении и вызове функции перед ее именем ставится знак амперсанда:

<?
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.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг