Les références vous permettent de faire pointer deux variables sur le même contenu. Par exemple, lorsque vous faites :
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):
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.
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'
?>
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
);
?>
Le troisième intérêt des références est de retourner des valeurs par référence .