Qu'est ce qu'une référence ?
Ce que les références ne sont pas
Les références
PHP Manual

## Que font les références ?

Les références vous permettent de faire pointer deux variables sur le même contenu. Par exemple, lorsque vous faites :

Exemple #1 Les références

`<?php
$a =& $b;
?>`

cela signifie que $a et $b pointent sur le même contenu.

> Note: $a et $b sont complètement égales ici : ce n'est pas $a qui pointe sur $b, ou vice-versa. C'est bien $a et $b qui pointent sur le même contenu.

> Note: Si un tableau par référence est copié, ses valeurs ne sont pas déréférencées. Cela est valide également pour les tableaux passés par valeur aux fonctions.

> Note: Si vous assignez, passez ou retournez une variable indéfinie par référence, elle sera créée automatiquement.

> Exemple #2 Utilisation des références avec des variables indéfinies

> `<?php
> function foo(&$var) { }
> foo($a); // $a est "créée" et assignée à 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)
> ?>`

La même syntaxe peut être utilisée avec les fonctions qui retournent des références, et avec l'opérateur new (PHP 4.0.4 et plus récent) :

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

Depuis PHP 5, new retourne une référence automatiquement, donc, l'utilisation de =& dans ce contexte est obsolète et produit un message de niveau `E_STRICT`.

> Note: Le fait de ne pas utiliser l'opérateur & produit une copie de l'objet. Si vous utilisez $this dans la classe, il fonctionnera dans l'instance courante de la classe. L'assignement sans l'opérateur & copiera l'instance (i.e. l'objet) et $this fonctionnera sur cette copie, ce qui n'est pas toujours le comportement désiré. Habituellement, vous voulez avoir une seule instance afin de préserver les performances et la consommation mémoire.
> Même si vous pouvez utiliser l'opérateur @ pour supprimer les messages d'erreurs du constructeur avec la syntaxe @new, cela ne fonctionnera pas avec la syntaxe &new. C'est une limitation du moteur Zend, et cela conduit à une erreur d'analyse.

Avertissement

Si vous assignez une référence à une variable définie en tant que global dans une fonction, la référence sera visible uniquement à l'intérieure de la fonction. Vous pouvez éviter cela en utilisant le tableau $GLOBALS.

Exemple #3 Référencer une variable globale à l'intérieure d'une fonction

`<?php
$var1 = "Variable Exemple";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible uniquement dans la fonction
} else {
$GLOBALS["var2"] =& $var1; // visible également dans un contexte global
}
}
global_references(false);
echo "var2 est défini à '$var2'\n"; // var2 est défini à ''
global_references(true);
echo "var2 est défini à '$var2'\n"; // var2 est défini à 'Variable Exemple'
?>`

Voyez global $var; comme un raccourci pour $var =& $GLOBALS['var'];. De ce fait assignant d'autres références à $var changeant uniquement la référence locale de la variable.

> Note: Si vous assignez des valeurs par références dans une structure foreach, les références seront également modifiées.

> Exemple #4 Références et structure foreach

> `<?php
> $ref = 0;
> $row =& $ref;
> foreach (array(1, 2, 3) as $row) {
> // faites quelque chose
> }
> echo $ref; // 3 - le dernier élément du tableau itéré
> ?>`

Le deuxième intérêt des références est de pouvoir passer des variables par référence. On réalise ceci en faisant pointer des variables locales vers le contenu des variables de fonction. Exemple :

Exemple #5 Passage de paramètre par référence

`<?php
function foo(&$var) {
$var++;
}
$a=5;
foo($a);
?>`

$a vaut 6. Cela provient du fait que dans la fonction foo, la variable $var pointe sur le même contenu que $a. Voir aussi les explications détaillées dans passage par référence.

Le troisième intérêt des références est de retourner des valeurs par référence.

Qu'est ce qu'une référence ?
Ce que les références ne sont pas
Les références
PHP Manual