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

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

  • автор:

Что такое ссылки 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

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

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

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

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

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

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

Комментарии

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

Профессия Python разработчик
Старт: 14 марта 2024

Изучение C++ от новичка до профи

Создание сайта с нуля на CMS WordPress

Уроки PhotoShop для начинающих

Ссылки в 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 всегда является ссылкой на вызывающий объект.

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

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