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
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) :
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.