PHP : Les références

Publié le 15 septembre 2009 par Methylbro

Définition d'une référence

En PHP une référence est une autre façon d'accéder à une valeur stockée en mémoire. Ainsi, au lieu d'avoir une variable x qui contient une valeur y, nous avons une variable x qui contient une référence vers la valeur y.

La documentation officielle de PHP compare les références avec les liens symboliques que l'on trouve sur les systèmes UNIX, l'analogie est intéressante.

Ainsi donc, si $A est une référence de la valeur $B alors $A et $B sont des variables qui pointent vers le même contenu.

En PHP lorsque l'on souhaite passer des arguments par référence, nous utiliserons le caractère &. Soit pour dire « A est une référence vers la valeur de B » :

$A =& $B;

Attention, si vous provenez du monde du C, ne confondez pas les références en PHP et les pointeurs que vous pourrez trouver en C. Il s'agit juste ici de pouvoir appeler une valeur identique avec des noms différents.

Une référence s'utilise ensuite comme n'importe quelle variable. Vous pouvez par exemple utilisez la fonction unset($ref) pour détruire votre référence.

Néanmoins, même s'il est très facile de détruire une référence, il deviendra plus complexe de supprimer la valeur stockée en mémoire. C'est pourquoi, la manipulation des références est un des points critique concernant la consommation en ressources mémoire d'un script.

Si l'on reprend notre exemple et que l'on supprime la variable originale $B. La valeur stockée derrière celle-ci sera toujours conservée en mémoire car il restera encore la référence $A liée.

Si vous ne prenez pas garde à faire un minimum le ménage dans vos scripts vous pouvez alors rapidement vous retrouver avec beaucoup de valeurs inutiles stockées en mémoire.

Le problème de la gestion de la mémoire est traité plus largement par ce que l'on appelle le Garbage Collector (le ramasse-miettes en français). Il sera intéressant de revenir sur le GC de PHP plus tard dans un autre article.

Passage de paramètres par référence

Malgré les ennuis que nous venons de voir, les références apportent de tout même plus de solutions que de problèmes. L'un des usages les plus courant et les plus agréable de ce concept est le passage d'arguments par référence.

En effet, il est très fréquent lors de développement d'application de vouloir modifier la valeur même d'un argument au sein d'une fonction. Un peu comme si ce paramètre était défini comme une variable globale.

Pour être plus clair, prenons par exemple les fonctions PHP de tri sur les tableaux comme usort, uksort ou autre. Le tableau que vous passez en paramètre est directement modifié et la fonction ne retourne qu'un booléen.

Prenons par exemple une fonction qui ajoute un retour de chariot à la fin d'une chaîne de caractères, avec la chaîne de caractères étant un paramètre par référence :

function addCRLF(&$string) {
$string."\r\n";
}
$machaine = 'Hello World !';
addCRLF($machaine);
echo $machaine;

Retourner des références

Dans un deuxième cas, il peut être intéressant de récupérer une référence plutôt qu'une valeur après l'exécution d'une fonction. Il ne faudra alors pas oublier de spécifier lors de la définition de la fonction que celle-ci retournera une référence.

Voyons un exemple dans un style un peu plus « Orienté Objet » :

class stdObject {
public $attribute = 1;
function & method() {
return $this->attribute;
}
}
$object = new stdObject;
$myRef = &$object->method();
$myRef = 'Hello World';
echo $object->attribute;

Dans cet exemple, $myRef devient un référence vers la même valeur que $object->attribute.