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(
123) 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.