4.10 Les références
4 Référence du langage
Manuel PHP
. Qu'est ce qu'une référence? ->Que font les références ? . Ce que les références ne sont pas . Passage par référence . Retourner des références . Détruire une référence . Repérer une référence
|
4.10.2 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 :
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.
|
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):
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 déprécié et produit un message de degré E_STRICT.
Note |
A 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.
|
Attention |
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
.
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 local 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.
Références et structure foreach |
<?php $ref = 0; $row =& $ref; foreach (array(1, 2, 3) as $row) { // faîte quelque chose } echo $ref; // 3 - le dernier élément du tableau itéré ?>
|
|
Attention |
Les tableaux complexes sont parfois plutôt copiés que référencés. De ce fait, l'exemple
suivant ne fonctionnera pas comme prévu :
Références avec un tableau complexe |
<?php $top = array( 'A' => array(), 'B' => array( 'B_b' => array(), ), );
$top['A']['parent'] = &$top; $top['B']['parent'] = &$top; $top['B']['B_b']['data'] = 'test'; print_r($top['A']['parent']['B']['B_b']); // array() ?>
|
|
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 :
Passage de paramètre par références |
<?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 .
|