Что такое ссылки php
Перейти к содержимому

Что такое ссылки php

  • автор:

Что такое ссылки php

Unlike in C, PHP references are not treated as pre-dereferenced pointers, but as complete aliases.

The data that they are aliasing («referencing») will not become available for garbage collection until all references to it have been removed.

«Regular» variables are themselves considered references, and are not treated differently from variables assigned using =& for the purposes of garbage collection.

The following examples are provided for clarification.

1) When treated as a variable containing a value, references behave as expected. However, they are in fact objects that *reference* the original data.

var = «foo» ;
$ref1 =& $var ; // new object that references $var
$ref2 =& $ref1 ; // references $var directly, not $ref1.

echo $ref1 ; // >Notice: Undefined variable: ref1
echo $ref2 ; // >foo
echo $var ; // >foo
?>

2) When accessed via reference, the original data will not be removed until *all* references to it have been removed. This includes both references and «regular» variables assigned without the & operator, and there are no distinctions made between the two for the purpose of garbage collection.

echo $var ; // >Notice: Undefined variable: var
echo $ref ; // >foo
?>

3) To remove the original data without removing all references to it, simply set it to null.

echo $var ; // Value is NULL, so nothing prints
echo $ref ; // Value is NULL, so nothing prints
?>

4) Placing data in an array also counts as adding one more reference to it, for the purposes of garbage collection.

Что такое Ссылки в PHP?

В PHP ссылки представляют собой альтернативный способ обращения к переменным. При использовании ссылок, две переменные ссылаются на одно и то же место в памяти, что позволяет вносить изменения в одну переменную, отражаясь на другой.

"; // Использование ссылок для обмена значениями function swapValues(&$x, &$y) < $temp = $x; $x = $y; $y = $temp; >swapValues($a, $b); echo "После обмена: a = $a, b = $b"; ?>

Комментарии

Пока комментариев нет

Профессия JavaScript разработчик
Старт: 25 января 2024

Современная вёрстка адаптивного веб-сайта

Изучение языка PHP, а также MySQL

Уроки C++ WinForms / Создание программ на Windows

Что такое ссылки php

Ссылки в PHP позволяют ссылаться на область памяти, где расположено значение переменной или параметра. Для создания ссылки перед переменной указывается символ амперсанда — & . Но перед рассмотрением ссылок сначала рассмотрим простой пример копирования переменных:

"; // tom = Tom echo "sam = $sam"; // sam = Sam ?>

Здесь переменной $sam присваивается значение переменной $tom («Tom»). Затем той же переменной $sam присваивается новое значение — «Sam». Результат программы ожидаем — обе переменные имеют различные значения:

tom = Tom sam = Sam

Теперь при копировании значения переменных передадим ссылку:

"; // tom = Sam echo "sam = $sam"; // sam = Sam ?>

Здесь нас интересует выражение

В данном случае переменной $sam передается не копия значения переменной $tom , как в предыдущем случае, а ссылка на область в памяти, которую занимает переменная $tom . То есть после выполнения инструкции

Обе переменных будут указывать на один и тот же адрес в памяти. Это приведет к тому, что изменение значения одной из этих переменных приведет к изменению значения другой переменной. Потому что они ссылаются на один и тот же участок в памяти и соответственно имеют одно общее значение:

tom = Sam sam = Sam

Присвоить ссылку на переменную можно двумя способами:

$sam = &$tom; // или так $sam = & $tom;

Передача по ссылке

В примере в прошлых темах мы передавали параметры по значению . Но в PHP есть и другая форма передачи параметров — по ссылке . Рассмотрим два этих способа передачи параметров и сравним. Стандартная передача параметра по значению:

 $number = 5; square($number); echo "
number = $number"; ?>
a = 25 number = 5

В данном случае внутри функции square() значение параметра $a возводится в квадрат. То есть значение параметра внутри функции изменяется. Однако после вызова функции square() значение переменной $number , которое передается параметру $a, не изменится. Это и есть передача по значению, она никак не затрагивает переменную $number .

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

 $number = 5; square($number); echo "
number = $number"; ?>
a = 25 number = 25

При передаче по ссылке перед параметром ставится знак амперсанда: function square(&$a) . Теперь интерпретатор будет передавать не значение переменной, а ссылку на эту переменную в памяти. То есть теперь и переменная $number и параметр $a будут указывать на одну и ту же область в памяти. В итоге, значение переменной $number после передачи параметру &$a также будет изменено.

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

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

 $userName = "admin"; $checkedName = &checkName($userName); echo "
userName: $userName"; echo "
checkedName: $checkedName"; ?>

В данном случае функция checkName() получает параметр по ссылке и возвращает ссылку — фактически ссылку, которая передается в функции. Для этого перед определением функции указан символ амперсанда:

Для имитации работы функция проверяет имя пользователя и изменяет его на некоторое стандартное, если оно равно «admin».

При вызове функции перед ее именем указывается символ амерсанда:

После выполнения функции переменная $checkedName фактически будет содержать ссылку на переменную $userName .

Ссылки — Основы PHP

В этом уроке мы изучим ссылки. Эта тема немного своеобразная: механизм ссылок напрямую используется редко.

Но это все равно важная тема. Когда мы начнем использовать массивы и объекты, нам понадобится понимание того, как ссылки работают.

Не относитесь к этому материалу слишком серьезно. Главное — уловить концепцию и знать само понятие, все остальное по необходимости.

Ссылки в PHP — это средство доступа к содержимому одной переменной под разными именами.

Так работает доступ без ссылок:

 $a = 5; $b = $a; $a = 3; echo $b; // => 5 

А теперь попробуем использовать ссылки:

 $a = 5; $b =& $a; $a = 3; echo $b; // => 3 

Запись =& говорит, что переменная слева начинает указывать на те же данные, что и переменная в правой части выражения.

Здесь стоит сказать: если вы запомнили переменные как коробочки, которые содержат внутри себя данные, то это не совсем верная аналогия. На самом деле, данные хранятся отдельно, а переменные — отдельно. Поэтому правильно говорить, что переменные ссылаются на свои данные.

Рассмотрим первую ситуацию подробнее:

 $a = 5; $b = $a; 

В этом коде переменная $a связывается с числом 5 . Затем мы выполняем присвоение $b = $a . Несмотря на то, что справа стоит $a , правильно этот код воспринимать как $b = 5 . Другими словами, вместо $a подставляется ее значение, которое становится значением $b .

Эти переменные не имеют между собой ничего общего, они не ссылаются на одни и те же данные. Это может показаться странным, ведь и там, и там записано одно и то же. Но это не так — у каждой переменной своя собственная пятерка.

Но все меняется, если во время присвоения добавить амперсанд: $b =& $a . Теперь $b и $a ссылаются на одно и то же значение. Если поменять его в $b , то оно поменяется и для $a . Обратное тоже верно. $a и $b здесь абсолютно эквивалентны, но это не означает, что $a указывает на $b , или наоборот. Это означает, что $a и $b указывают на одно и то же значение.

Вероятно, сейчас вы чувствуете легкое замешательство. Если это так — не переживайте, это нормально. Тема ссылок — вещь, которую сложно понять и прочувствовать, прочитав один урок.

Есть три основных операции с использованием ссылок:

  • Присвоение по ссылке
  • Передача по ссылке
  • Возврат по ссылке

Выше мы рассматривали довольно искусственные примеры. Практически единственное место, где ссылки встречаются в реальной жизни — аргументы функций, причем встроенные в сам язык. В основном это касается массивов, с которыми мы познакомимся позже. А пока посмотрим на этот прием без них:

 // Либо так: function strangeFunction(&$text) function strangeFunction(string &$text)  $text = 'hei'; > $text = 'money'; strangeFunction($text); echo $text; // => hei 

В этом примере сама функция декларирует, что ее аргумент передается по ссылке. Самое неприятное — вы об этом даже не узнаете, если внимательно не прочитаете документацию. Обычно такие функции ничего не возвращают, они меняют аргументы, что, кстати, считается плохой практикой. Подобное поведение имеет смысл только в некоторых ситуациях, где крайне важна производительность — например, при сортировке массивов.

Особняком стоят объекты, которые всегда передаются по ссылке. Об этом рассказывается в следующих курсах.

Дополнительные материалы
  1. Официальная документация
  2. Пример функции работающей со ссылками: fscan

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *