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 22.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 assigner, passer ou retourner une variable indéfinie par référence, elle sera créée.

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

Exemple 22.3. Les références et new()

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

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 22.4. 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 22.5. 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 22.6. 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 .