Referências
PHP Manual

O que as referências fazem

Referências PHP permitem fazer duas variáveis se referirem ao mesmo conteúdo. Ou seja:

<?php
$a 
=& $b;
?>
aqui $a e $b apontam para o mesmo conteúdo.

Nota:

$a e $b são completamente iguais aqui, mas não porque $a está apontando para $b ou vice versa, mas sim que $a e $b apontam para o mesmo lugar.

Nota:

Se o array com referências é copiado, seus valores não são referenciados. Isto é válido também para arrays passados por valor para funções.

Nota:

Se você atribuir, passar ou retornar uma variável indefinida por referência, ela irá ser criada.

Exemplo #1 Usando referência com variáveis indefinidas

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

foo($a); // $a é "criada" e setada par 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)
?>

A mesma sintaxe pode ser utilizada com funções, que retornem referências, e com o operador new (a partir do PHP 4.0.4):

<?php
$bar 
=& new fooclass();
$foo =& find_var ($bar);
?>
Desde o PHP 5, new retorna referência automaticamente, então usar =& neste contexto é obsoleto e produz mensagem de nível E_STRICT.

Nota:

A não utilização do operador & causará a cópia do objeto. Se você utiliza $this em classes, ele operará na instância atual do objeto. A assimilação sem & irá copiar a instância (o objeto em si) e $this irá operar na cópia, podendo não ser esse procedimento sempre desejável. Normalmente você precisará trabalhar com uma instância única, seja por motivos de performance ou de consumo de memória.

Você pode utilizar o operador @ para esconder quaisquer erros em construtores na forma @new, mas isto não funciona quando utilizada a instrução &new. Esta é uma limitação da Zend Engine e irá gerar um erro de interpretação (parser error).

Aviso

Se você atribuir uma referência para uma variável declarada global dentro da função, a referência irá ser visível somente dentro da função. Você pode evitar isto usando o array $GLOBALS.

Exemplo #2 Referenciando variáveis globais de dentro de funções

<?php
$var1 
"Example variable";
$var2 "";

function 
global_references($use_globals)
{
    global 
$var1$var2;
    if (!
$use_globals) {
        
$var2 =& $var1// visível somente dentro da função
    
} else {
        
$GLOBALS["var2"] =& $var1// visível também no contexto global
    
}
}

global_references(false);
echo 
"var2 is set to '$var2'\n"// var2 is set to ''
global_references(true);
echo 
"var2 is set to '$var2'\n"// var2 is set to 'Example variable'
?>
Veja global $var; como atalho para $var =& $GLOBALS['var'];. Assim atribuir outra referência para $var somente modifica a variável de referência local.

Nota:

Se você atribuir um valor para uma variável com referência no comando foreach, a referência é modificada também.

Exemplo #3 Referências e o comando foreach

<?php
$ref 
0;
$row =& $ref;
foreach (array(
123) as $row) {
    
// faz alguma coisa
}
echo 
$ref// 3 - último elemento do array iterado
?>

A segunda coisa que referências permitem é passar variáveis por referência. Isto é feito marcando uma variável local de uma função e a variável do escopo chamador como referências ao mesmo conteúdo. Exemplo:

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

$a=5;
foo ($a);
?>
Fará com que $a seja 6. Isto acontece porque na função foo a variável $var se refere ao mesmo conteúdo que $a. Veja explicações mais detalhadas em passagem por referência.

Em terceiro lugar, referências permitem também retorno por referência.


Referências
PHP Manual