Il y a 3 utilisations principales des références: assignation par référence, passage par référence, et retourner par référence. Cette section introduit ces opérations, avec des liens vers plus de précision.
Dans ce premier cas, les références PHP vous permettent de faire en sorte que 2 variables référencent le même contenu. Ainsi :
<?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 assignez, passez ou retournez une variable indéfinie par référence, elle sera créée automatiquement.
Exemple #1 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 (depuis PHP 4.0.4 et avant PHP 5.0.0) :
<?php
$foo =& find_var($bar);
?>
Si vous assignez une référence à une variable déclarée global dans une fonction, la référence ne sera visible qu'au sein de la fonction. Vous pouvez éviter cela en utilisant le tableau $GLOBALS.
Exemple #2 Référencer des variables globales depuis 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 #3 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 :
<?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.