Что такое ссылки 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
В этом примере сама функция декларирует, что ее аргумент передается по ссылке. Самое неприятное — вы об этом даже не узнаете, если внимательно не прочитаете документацию. Обычно такие функции ничего не возвращают, они меняют аргументы, что, кстати, считается плохой практикой. Подобное поведение имеет смысл только в некоторых ситуациях, где крайне важна производительность — например, при сортировке массивов.
Особняком стоят объекты, которые всегда передаются по ссылке. Об этом рассказывается в следующих курсах.
Дополнительные материалы
- Официальная документация
- Пример функции работающей со ссылками: fscan
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Что такое Ссылки в PHP?
В PHP ссылки представляют собой альтернативный способ обращения к переменным. При использовании ссылок, две переменные ссылаются на одно и то же место в памяти, что позволяет вносить изменения в одну переменную, отражаясь на другой.
"; // Использование ссылок для обмена значениями function swapValues(&$x, &$y) < $temp = $x; $x = $y; $y = $temp; >swapValues($a, $b); echo "После обмена: a = $a, b = $b"; ?>
Комментарии
Пока комментариев нет
Профессия Python разработчик
Старт: 14 марта 2024
Ссылки в PHP
Ссылки в PHP — это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели C и не являются псевдонимами таблицы символов. В PHP имя переменной и её содержимое — это разные вещи, поэтому одно содержимое может иметь разные имена. Ближайшая аналогия — имена файлов Unix и файлы — имена переменных являются элементами каталогов, а содержимое переменных это сами файлы. Ссылки в PHP — аналог жёстких ссылок (hardlinks) в файловых
Что делают ссылки
Ссылки в PHP дают возможность двум переменным ссылаться на одно содержимое. Например:
означает, что $a указывает на то же содержание, что и $b.
Замечание: $a и $b здесь абсолютно эквивалентны, но это не означает, что $a указывает на $b или наоборот. Это означает, что $a и $b указывают на одно место.
Замечание: При копировании массива ссылок, они не разыменовываются. Это также касается массивов, передаваемых функциям по значению.
Такой же синтаксис можно использовать и в функциях, возвращая ссылки, а так же в операторе new (начиная с PHP 4.0.4):
$bar =& new fooclass(); $foo =& find_var($bar);
Замечание: Если опустить &, это приведёт к копированию объекта. Если вы используете $this в классе, операция проводится над текущим экземпляром этого класса. Присвоение без & приведёт к копированию экземпляра, и $this будет работать с копией, что не всегда желательно. Обычно, вам нужно иметь один экземпляр, из соображений производительности и использования памяти.
Операция @, которая скрывает сообщения об ошибках, например в конструкторе @new, не может быть использована совместно с операцией & (&new). Это ограничение интерпретатора Zend.
Внимание: Если переменной, объявленной внутри функции как global, будет присвоена ссылка, она будет видна только в функции. Чтобы избежать это, воспользуйтесь массивом $GLOBALS.
Пример. Присвоение ссылок глобальным переменным внутри функции
$var1 = "Example variable"; $var2 = ""; function global_references($use_globals) < global $var1, $var2; if (!$use_globals) < $var2 =& $var1; // только локально >else < $GLOBALS["var2"] =& $var1; // глобально >> global_references(false); echo "значение var2: '$var2'\n"; // значение var2: '' global_references(true); echo "значение var2: '$var2'\n"; // значение var2: 'Example variable'
Думайте о global $var; как о сокращении от $var =& $GLOBALS[‘var’];. Таким образом, присвоение $var другой ссылки влияет лишь на локальную переменную.
Замечание: При использовании переменной-ссылки в foreach, изменяется содержание, на которое она ссылается.
Пример. Ссылки и foreach
$ref = 0; $row =& $ref; foreach (array(1, 2, 3) as $row) < // do something >echo $ref; // 3 - последнее значение, используемое в цикле
Внимание: Сложные массивы в некоторых случаях могут копироваться вместо создания ссылок. например, следующий пример не будет работать как ожидалось.
Пример. Ссылки и сложные массивы
$top = array( 'A' => array(), 'B' => array( 'B_b' => array(), ), ); $top['A']['parent'] = &$top; $top['B']['parent'] = &$top; $top['B']['B_b']['data'] = 'test'; print_r($top['A']['parent']['B']['B_b']); // array()
Второе, что делают ссылки — передача параметров по ссылке. При этом локальная переменная в функции и переменная в области видимости вызывателя ссылаются на одно и то же содержимое. Пример:
function foo(&$var) < $var++; >$a=5; foo($a);
Этот код присвоит $a значение 6. Это происходит, потому что в функции foo переменная $var ссылается на то же содержимое, что и переменная $a. См. также детальное объяснение передачи по ссылке.
Третье, что могут ссылк — возвращение значение по ссылке.
Чем ссылки не являются
ссылки не являются указателями. Это означает, что следующая конструкция не будет делать то, что вы ожидаете:
function foo(&$var) < $var =& $GLOBALS["baz"]; >foo($bar);
Переменная $var в фукнции foo будет связана с $bar в вызывателе, но затем она будет перепривязана к $GLOBALS[«baz»]. Нет способа связать $bar в области видимости вызывателя с чем-либо ещё путём использования механизма ссылок, поскольку $bar не доступна в функции foo (доступно лишь её значение через $var). Вы можете воспользоваться возвращением ссылок из функции для привязки внешней перменной к другому значению.
Передача по ссылке
Вы можете передавать переменные в функцию по ссылке, и функция сможет изменять свои аргументы. Синтаксис таков:
function foo(&$var) < $var++; >$a=5; foo($a); // $a здесь равно 6
Заметьте, что в вызове функции отсутствует знак ссылки — он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке.
- Переменные, например foo($a)
- Оператор new, например foo(new foobar())
- Ссылки, возвращаемые функцией, например:
function &bar() < $a = 5; return $a; >foo(bar());
Любое другое выражение не должно передаваться по ссылке, так как результат не определён. Например, следующая передача по ссылке является неправильной:
function bar() // Операция & отсутствует < $a = 5; return $a; >foo(bar()); foo($a = 5); // Выражение, а не переменная foo(5); // Константа, а не переменная
Эти требования для PHP 4.0.4 и позже.
Возвращение по ссылке
Возвращение по ссылке используется в тех случаях, когда вы хотите использовать функцию для выбора переменной, с которой должна быть связана данная ссылка. При возвращении по ссылке используйте такой синтаксис:
function &find_var($param) < /* . код . */ return $found_var; >$foo =& find_var($bar); $foo->x = 2;
В этом примере устанавливается свойство объекта, возвращённого функцией find_var, а не его копии, как было бы без использования ссылок.
Замечание: В отличие от передачи параметров по ссылке, & здесь нужно использовать в обоих местах — для указания на то, что вы возвращаете ссылку, а не копию, как обычно, и для указания того, что происходит связывание по ссылке, а не обычное присвоение.
Сброс переменных-ссылок
При сбросе ссылки, просто разрывается связь имени и содержимого переменной. Это не означает, что содержимое переменной будет разрушено. Например:
$a = 1; $b =& $a; unset($a);
Этот код не сбросит $b, а только $a.
Опять же, можно провести аналогию с вызовом unlink (в Unix).
Неявное использование механизма ссылок
Многие синтаксические конструкции PHP реализованы через механизм ссылок, поэтому всё сказанное выше о ссылочном связывании применимо также и к этим конструкциям. Некоторые конструкции, вроде передающих и возвращающих по ссылке, рассмотрены ранее. Другие конструкции, использующие ссылки:
Ссылки global
Если вы объявляете переменную как global $var, вы фактически создаёте ссылку на глобальную переменную. Это означает то же самое, что:
Это значит, например, что сброс (unset) $var не приведёт к сбросу глобальной переменной.
$this
В методах объекта, $this всегда является ссылкой на вызывающий объект.