Manuel PHP

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 :

Example#1 Les références

  1. <?php
  2. $a =& $b;  
  3. ?> 
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 assigner, passer ou retourner une variable indéfinie par référence, elle sera créée.

Example#2 Utilisation des références avec des variables indéfinies

  1. <?php
  2. function foo(&$var) { }  
  3.  
  4. foo($a); // $a est "créée" et assignée à NULL
  5.  
  6. $b = array();  
  7. foo($b['b']);  
  8. var_dump(array_key_exists('b', $b)); // bool(true)
  9.  
  10. $c = new StdClass;  
  11. foo($c->d);  
  12. var_dump(property_exists($c, 'd')); // bool(true)
  13. ?> 

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

Example#3 Les références et new()

  1. <?php
  2. $bar =& new fooclass();  
  3. $foo =& find_var($bar);  
  4. ?> 
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 degré E_STRICT.

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.

Warning

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.

Example#4 Référencer une variable globale à l'intérieure d'une fonction

  1. <?php
  2. $var1 = "Variable Exemple";  
  3. $var2 = "";  
  4.  
  5. function global_references($use_globals)  
  6. { 
  7.    global $var1, $var2; 
  8.    if (!$use_globals) { 
  9.       $var2 =& $var1; // visible uniquement dans la fonction
  10.    } else { 
  11.       $GLOBALS["var2"] =& $var1; // visible également dans un contexte global
  12.    }  
  13. }  
  14.  
  15. global_references(false);  
  16. echo "var2 est défini à '$var2'\n"; // var2 est défini à ''
  17. global_references(true);  
  18. echo "var2 est défini à '$var2'\n"; // var2 est défini à 'Variable Exemple'
  19. ?> 
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.

Example#5 Références et structure foreach

  1. <?php
  2. $ref = 0;  
  3. $row =& $ref;  
  4. foreach (array(1, 2, 3) as $row) { 
  5.    // faites quelque chose
  6. }  
  7. echo $ref; // 3 - le dernier élément du tableau itéré
  8. ?> 

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 :

Example#6 Passage de paramètre par référence

  1. <?php
  2. function foo(&$var) {  
  3. $var++;  
  4. }  
  5. $a=5;  
  6. foo($a);  
  7. ?> 
$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.


Remonter Remonter
L'éditeur javascript - CSS - Gentoo - Tutoriaux PHP - Tutoriels PHP - Breizh Blog