TUTORIELS 
Utiliser les références avec PHP
Les références permettent de créer des alias pointant directement vers l'adresse mémoire d'une variable, et sont parfois très utiles pour optimiser les scripts, mais pas seulement...  (20 février 2004)
 
Forums
* Discutez en sur les forums
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 "=&"...

 
[ Xavier BorderieJDNet
 
Accueil | Haut de page