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;
?>
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 assigner, passer ou retourner une variable indéfinie par référence, elle sera créée.
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):
Exemple #3 Les références et new()
<?php
$bar =& new fooclass();
$foo =& find_var($bar);
?>
Note: À moins d'utiliser la syntaxe ci-dessus, le résultat de $bar = new fooclass() ne sera pas la même variable que $this dans le constructeur, ce qui signifie que si vous avez utilisé la référence $this dans le constructeur, vous devez assigner la référence, ou bien obtenir deux objets différents.
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.
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 #4 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'
?>
Note: Si vous assignez des valeurs par références dans une structure foreach, les références seront également modifiées.
Exemple #5 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 #6 Passage de paramètre par référence
<?php
function foo(&$var) {
$var++;
}
$a=5;
foo($a);
?>
Le troisième intérêt des références est de retourner des valeurs par référence.