Les "références"
sont implémentées de différentes manières
selon les langages, et de fait renvoient parfois à des fonctionnalités
différentes. Nous avons donc ici pris le parti de les présenter
telles qu'implémentées au sein de PHP, quitte à
y retourner avec un nouveau langage dans un autre article.
Utilité
Les références telles qu'implémentées
par PHP ne sont pas une nouvelle forme de programmation, mais tout
de même un raccourci fort pratique dans certaines situations,
notamment en combinant variables et fonctions.
Concrètement, les références permettent de
créer des "alias" pointant directement vers une
variable (plus précisément son adresse en mémoire),
plutôt que
de copier cette variable (ou la dupliquer en mémoire).
$a = 42;
$b = &$a; // "&" marque la référence
echo $b; // affiche 42
$a++; // $a vaut maintenant 43
echo $b; // affiche 43
unset($a); // $a n'existe plus
echo $b; // affiche 43 - $b fait toujours référence
// au contenu
initial de $a
En combinaison
avec les fonctions, on peut utiliser les références
de deux manières : lorsque l'on passe la référence
à la fonction, et lorsque l'on renvoie le résultat
de la fonction. Voyons ces deux cas...
Passer une
variable par référence
Voyons directement l'utilisation :
function
incrementer(&$valeur)
{
$valeur
= $valeur + 1;
}
$a = 1;
incrementer($a);
echo $a; // affiche "2"
Que venons-nous de faire ? Nous venons
de créer une fonction qui incrémentera de 1 toute
valeur qui lui est passée. Sans la référence
(indiquée par l'utilisation d'une "&" devant
la variable), cette fonction ne marcherait pas, étant donné
que l'influence de $valeur se limite
par défaut à la fonction elle-même :
function
incrementer2($valeur)
{
$valeur
= $valeur + 1;
}
$a = 1;
incrementer2($a);
echo $a; // affiche "1" car $valeur ne sort pas de la
fonction
En revanche, nous constatons que la
fonction incrementer() ne nous apporte
que l'économie d'un return
par rapport à la fonction équivalente suivante :
function
incrementer3($valeur)
{
$valeur
= $valeur + 1;
return $valeur
}
$a = 1;
$a = incrementer3($a);
echo $a; // affiche "2"
C'est oublier que l'on peut mettre
autant d'arguments que l'on souhaite, tandis que return
ne peut renvoyer qu'une variable. Le passage de variable par référence
devient extrêmement utile dès que la fonction doit
travailler avec plusieurs variables. On peut alors utiliser return
pour renvoyer un booléen indiquant si la fonction s'est bien
déroulée ou pas :
function
calculs(&$add, &$sous, &$multi,
&$div, &$reste)
{
$add
= $add + 1;
$sous
= $sous - 3;
$multi
= $multi * 7;
$div
= $div / 15;
$reste
= $reste % 2;
if ( ($add == 0) && ($sous == 0) &&
($reste == 0) )
{
return
"gagné!";
}
return
"perdu!";
}
$a = -1;
$s = 3;
$m = 21;
$d = 15;
$r = 20;
echo calculs($a, $s, $m, $d, $r); // affiche "gagné!"
Passer des variables par référence
se rapproche donc de l'utilisation de variables globales dans une
fonction, mais avec plus de souplesse. Les variables globales sont
une forme de référence.
Renvoyer des
variables par référence
Moins utilisé que la méthode ci-dessus, le renvoi
par référence a pourtant ses adeptes, et dans ce monde
de l'Open Source, il est important de savoir la reconnaître.
Renvoyer une variable par référence a pour principal
avantage d'éviter de faire une copie de la variable en mémoire,
ce qui peut réaliser une économie précieuse
en temps - une bonne manière d'optimiser son code.
function
&puissance($nombre, $exposant = 2)
{
return pow($nombre, $exposant)
}
$a =& puissance(3);
$b =& puissance(2, 3);
echo $a, $b; //affiche 98
Il faut noter que là où
le passage de variable est défini par référence
une bonne fois pour toute (on ne peut pas espérer passer
par valeur dès lors que la fonction utilise des esperluettes
dans ses arguments), on peut au choix faire en sorte qu'une fonction
renvoi des variables par référence ou par valeur :
il suffit pour cela d'utiliser l'opérateur "="
au lieu de "=&"...
|