Aujourd'hui, j'ai eu envie de vous parler d'une notion php très utile, mais pourtant peu connue : les variables dynamiques (aussi appelées « les variables variables »). Cette notion m'a sauvée la vie à plusieurs reprises au cours de ces dernières années !
Qu'est-ce qu'une variable dynamique ?
Une variable dynamique, c'est tout simplement une variable dont le nom est… dynamique. C'est-à-dire que son nom est affecté et utilisé dynamiquement, selon les besoins du script.
Une variable dynamique peut être déclarée de deux manières :
$temp // variable "classique"
$$temp // 1ère écriture de la variable dynamique
${$temps} // 2ème écriture de la variable dynamique Voici un exemple tiré de la documentation officielle de php :
$a = 'bonjour';
$$a = 'monde';
echo "$a ${$a}"; // retourne "bonjour monde"
echo "$a $bonjour"; // retourne également "bonjour monde" Exemple concret d'utilisation des variables dynamiques
Vous le savez peut-être, j'ai créé il y a quelques années un jeu de gestion de centre équestre. Je développe régulièrement de nouvelles fonctionnalités sur ce jeu, et il y a quelques semaines j'ai eu besoin des variables dynamiques.
Le contexte
La demande initiale : ajouter un système permettant aux joueurs d'acheter des chevaux créés aléatoirement.
La problématique : les compétences du cheval doivent être générées dynamiquement en fonction de la race du cheval. Sur les 7 compétences existantes, chaque cheval généré aura des points dans seulement 3 d'entre elles.
Solution 1 : la multitude de « if »
La première méthode consiste à recourir à une multitude de « if » :
$coupling = $reining = $dressage = $jumping = $racing = 0;
if (in_array('coupling', $bestSkills)) $coupling = 10;
if (in_array('reining', $bestSkills)) $reining = 10;
if (in_array('dressage', $bestSkills)) $dressage = 10;
if (in_array('jumping', $bestSkills)) $jumping = 10;
if (in_array('racing', $bestSkills)) $racing = 10; Solution 2 : utiliser des variables dynamiques
$coupling = $reining = $dressage = $jumping = $racing = 0;
foreach ($bestSkills as $skill) {
$$skill = 10;
} Comparatif des deux méthodes
Les deux méthodes fonctionnent parfaitement. Mais la première méthode est bien plus fastidieuse. Elle nécessite en effet davantage de lignes de code, à raison d'une par compétence.
En utilisant les variables dynamiques, peu importe le nombre de compétences : le code ne sera pas plus long. Que j'ai 3 variables ou 300, pas la peine d'écrire une ligne de plus !
Mise en garde
Attention, les variables dynamiques restent une notion très sensible. En effet, elles peuvent potentiellement écraser d'autres noms de variables. Utilisez-les donc avec précaution, de préférence en les isolant dans une méthode dans laquelle il n'est pas possible d'usurper des variables.
Dans de nombreux cas, les tableaux peuvent être une solution alternative plus sûre : pensez-y !
Néanmoins, comme nous venons de le voir, dans certaines situations les variables dynamiques sont réellement très utiles.
Et vous ? Avez-vous déjà eu recours aux variables dynamiques ? Dans quels cas ?