Что делают ссылки
Ссылки в PHP дают возможность двум переменным ссылаться на одно
содержимое. Например:
означает, что $a указывает на то же содержание,
что и $b.
Замечание:
$a и $b здесь абсолютно эквивалентны,
но это не означает, что $a указывает на $b или наоборот. Это означает, что
$a и $b указывают на одно место.
Замечание:
При копировании массива ссылок, они не разыменовываются.
Это также касается массивов, передаваемых функциям по значению.
Замечание:
Если вы возвращаете из функции ссылку на неинициализированную
переменную - она будет создана.
Пример #1 Использование ссылок с неинициализированными переменными
<?php
function foo(&$var) { }
foo($a); // $a создана и равна null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
Такой же синтаксис можно использовать и в функциях, возвращая ссылки,
а так же в операторе new (начиная с PHP 4.0.4):
Замечание:
Если опустить &, это приведёт к копированию объекта.
Если вы используете $this в классе, операция
проводится над текущим экземпляром этого класса. Присвоение без
& приведёт к копированию экземпляра, и
$this будет работать с копией, что не всегда
желательно. Обычно, вам нужно иметь один экземпляр, из соображений
производительности и использования памяти.
Операция @, которая скрывает
сообщения об ошибках, например в конструкторе @new,
не может быть использована совместно с операцией
& (&new).
Это ограничение Zend Engine.
Внимание
Если переменной, объявленной внутри функции как
global, будет присвоена ссылка, она будет видна только
в функции. Чтобы избежать этого, используйте массив $GLOBALS.
Пример #2 Присвоение ссылок глобальным переменным внутри функции
<?php
$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,
изменяется содержание, на которое она ссылается.
Пример #3 Ссылки и foreach
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// do something
}
echo $ref; // 3 - последнее значение, используемое в цикле
?>
Внимание
Сложные массивы в некоторых случаях могут копироваться вместо создания
ссылок. например, следующий пример не будет работать как ожидалось.
Пример #4 Ссылки и сложные массивы
<?php
$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()
?>
Второе, что делают ссылки - передача параметров по ссылке. При этом
локальная переменная в функции и переменная в области видимости вызывателя
ссылаются на одно и то же содержимое. Пример:
Этот код присвоит $a значение 6. Это происходит, потому
что в функции foo переменная $var
ссылается на то же содержимое, что и переменная $a. См.
также детальное объяснение
передачи по ссылке.
Третье, что могут ссылки - возвращение значение по ссылке.