Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Ссылки в PHP
Что такое ссылки
Ссылки в PHP - это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели C и не являются псевдонимами таблицы символов. В PHP имя переменной и её содержимое - это разные вещи, поэтому одно содержимое может иметь разные имена. Ближайшая аналогия - имена файлов Unix и файлы - имена переменных являются элементами каталогов, а содержимое переменных это сами файлы. Ссылки в PHP - аналог жёстких ссылок (hardlinks) в файловых
Что делают ссылки
Ссылки в PHP дают возможность двум переменным ссылаться на одно содержимое. Например:
$a =& $b;
означает, что $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, вы фактически создаёте ссылку на глобальную переменную. Это означает то же самое, что:
$var =& $GLOBALS["var"];
Это значит, например, что сброс (unset) $var не приведёт к сбросу глобальной переменной.
$this
В методах объекта, $this всегда является ссылкой на вызывающий объект.
Смотрите также:
Описание на ru2.php.net
Описание на php.ru