Ссылки. Разъяснения
PHP Manual

Что делают ссылки

Ссылки в PHP дают возможность двум переменным ссылаться на одно содержимое. Например:

<?php
$a 
=& $b;
?>
означает, что $a указывает на то же содержание, что и $b.

Note: $a и $b здесь абсолютно эквивалентны, но это не означает, что $a указывает на $b или наоборот. Это означает, что $a и $b указывают на одно место.

Note: При копировании массива ссылок, они не разыменовываются. Это также касается массивов, передаваемых функциям по значению.

Такой же синтаксис можно использовать и в функциях, возвращая ссылки, а так же в операторе new (начиная с PHP 4.0.4):

<?php
$bar 
=& new fooclass();
$foo =& find_var($bar);
?>

Note: Если опустить &, это приведёт к копированию объекта. Если вы используете $this в классе, операция проводится над текущим экземпляром этого класса. Присвоение без & приведёт к копированию экземпляра, и $this будет работать с копией, что не всегда желательно. Обычно, вам нужно иметь один экземпляр, из соображений производительности и использования памяти.
Операция @, которая скрывает сообщения об ошибках, например в конструкторе @new, не может быть использована совместно с операцией & (&new). Это ограничение интерпретатора Zend.

Warning

Если переменной, объявленной внутри функции как global, будет присвоена ссылка, она будет видна только в функции. Чтобы избежать это, воспользуйтесь массивом $GLOBALS.

Example#1 Присвоение ссылок глобальным переменным внутри функции

<?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 другой ссылки влияет лишь на локальную переменную.

Note: При использовании переменной-ссылки в foreach, изменяется содержание, на которое она ссылается.

Example#2 Ссылки и foreach

<?php
$ref 
0;
$row =& $ref;
foreach (array(
123) as $row) {
    
// do something
}
echo 
$ref// 3 - последнее значение, используемое в цикле
?>

Warning

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

Example#3 Ссылки и сложные массивы

<?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()
?>

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

<?php
function foo(&$var)
{
    
$var++;
}

$a=5;
foo($a);
?>
Этот код присвоит $a значение 6. Это происходит, потому что в функции foo переменная $var ссылается на то же содержимое, что и переменная $a. См. также детальное объяснение передачи по ссылке.

Третье, что могут ссылк - возвращение значение по ссылке.


Ссылки. Разъяснения
PHP Manual