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