Les variables dynamiques

Cela ne vous est jamais arrivé de vous demander si il était possible de créer des variables dynamiques ?
C'est à dire des variables ayant un nom changeant au cours du script ?

Et bien c'est tout à fait possible de faire ceci en PHP.

En effet, grâce aux variables dynamiques vous allez pouvoir utiliser des noms de variables qui sont eux mêmes (les noms), variables, ce qui veut dire que vous allez utiliser des noms de variables qui sont affectés et utilisés dynamiquement dans votre script.

D'après ce que l'on vient dire, une variable dynamique serait alors une variable qui aurait comme nom la valeur d'une variable, par exemple $var.
En effet, si nous définissons la variable $hello, avec en valeur la chaîne de caractères Coucou, on aurait la chose suivante :

exemple1.php
<?php
$var = 'hello';
$hello = 'Coucou';
echo ${$var};
?>


Qui affichera :

Coucou


C'est à dire la valeur de la variable $hello.

En utilisant le code :

exemple2.php
<?php
$var ='hello';
$hello = 'Coucou';
echo $hello;
?>


Nous aurions eu exactement le même résultat.

Vous remarquez alors au passage le fonctionnement d'une variable dynamique :
  • on initialise une variable ayant une certaine valeur
  • on veut utiliser une autre variable ayant comme nom la valeur de notre variable précédente : pour cela, nous déclarons notre variable avec un $, puis avec l'intitulé de notre variable précédent entre deux crochets, ce qui donne : ${$var}


Malgré, cette brève description des variables dynamiques, j ai comme l'impression que vous n'êtes pas du tout convaincu.
Mais à quoi bon peuvent elles bien servir ces variables dynamiques ?

Tout simplement à faire du dynamique :)

Imaginons que l'on ai dans notre script PHP deux variables de type tableau (ou array) et que l'on désire accéder à l'un de ces tableaux.

Au lieu de faire des tests fous pour savoir à quel tableau on veut accéder, il nous suffit de créer une variable de type chaîne de caractères contenant le nom de notre tableau (celui que l'on désire parcourir) et d'utiliser une variable dynamique pour accéder à notre tableau.

Exemple :

exemple3.php
<?php
$tableau1 = array ('test', 'toto', 'titi');
$tableau2 = array ('humpf', 'grmbl');

$var = 'tableau1';
$nb_elements = count (${$var});
for ($i=0; $i<$nb_elements; $i++) {
// on accede aux éléments du tableau $tableau1
echo ${$var}[$i].'<br />';
}
?>


Ce qui affichera donc :

test
toto
titi


L'exemple peut vous paraître un peu bête, mais regardez le de plus près : en effet, si nous décidons du jour au lendemain de changer le nom de notre tableau (afin de parser un autre tableau), nous n'aurons qu'une seule ligne à modifier :

exemple4.php
<?php
$var = 'tableau1';
?>


(On aurait en fait écrit le nom d'un nouveau nom de tableau)



Alors qu'en n'utilisant pas les variables dynamiques, nous aurions du modifier cette même ligne, mais aussi la ligne concernant le comptage du nombre d'élément de notre tableau mais aussi la ligne contenue dans notre boucle for (le echo).

Les variables apportent alors leur lot d'avantages :
  • la clarté du code
  • du code dynamique réutilisable
  • des solutions à des problèmes liés à la dynamique d'un script (comme par exemple généré un formulaire contenant un nombre indéfini de champs)


Avant de poursuivre ce cours, sachez également que le nombre de variables dynamiques utilisées est théoriquement sans limites.

Vous pouvez très bien faire, par exemple :

exemple5.php
<?php
$var = 'toto';
$toto = 'test';
$test = 'humpf';

echo ${${$var}};
?>


Ce qui affichera :

Humpf


Voyons maintenant un cas concret sur lequel il est intéressant d'utiliser les variables dynamiques.
Imaginez que vous ayez un formulaire, et dans la page de traitement de ce formulaire, plusieurs actions sont possibles.

Jusqu'à présent, pour faire votre page de traitement, vous deviez enchaîner une série de if elseif else (ou même mieux en utilisant un case) afin de savoir dans quel cas vous vous trouvé, et de plus, vous deviez écrire un bon paquet de ligne de code pour décrire chaque action.

Tout ceci peut-être largement simplifié grâce aux variables dynamiques.
En effet, imaginons que notre formulaire contienne un champ caché contenant une des valeurs suivantes (au choix) :
  • insert
  • delete
  • update
  • select


Voici alors le code d'une page de traitement possible de ce formulaire :

exemple6.php
<?php
$champ_cache = $_POST['champ_cache'];

function insert() {
// code
}

function delete() {
// code
}
function update() {
// code
}

function select() {
// code
}

if ($champ_cache == 'insert' || $champ_cache == 'delete' || $champ_cache == 'update' || $champ_cache == 'select') {
$champ_cache();
}
?>


Dans ce cas précis, on parlera de fonction dynamique.
Car comme vous pouvez le constater, on utilise la valeur d'une variable pour désigner le nom d'une fonction.

Voyons un autre cas d'utilisation, où là, nous allons pouvoir générer dynamiquement un formulaire.

Générer un formulaire dynamiquement veut dire que la personne utilisant le formulaire pourra choisir, elle-même, le nombre de champs de type text contenu dans ce formulaire, et grâce aux variables dynamiques, nous allons pouvoir récupérer la valeur de ces champs sans connaître auparavant le nombre de champs de ce formulaire (vu que ce nombre est décidé par la personne utilisant le formulaire)

Voici le code :

exemple7.php
<?php
// si l'utilisateur soumet le formulaire on affiche la valeur de tous les champs du formulaire
if (isset($_POST['submit']) && $_POST['submit'] == "Envoyer"){
// on affiche le nombre de champs du formulaire
echo 'Nombre de champs : '.$_POST['nb_champs'].'<br />';

// on affiche la valeur des champs du formulaire
for ($i=1; $i<=$_POST['nb_champs']; $i++){
$dynamique = 'champs_'.$i;
$value = $_POST[$dynamique];
echo 'Valeur du champ '.$i.' : '.$value.'<br />';
}
}

// sinon on affiche le formulaire avec la possibilité d'ajout des champs au formulaire
else{
// on défini le nombre initial de champs
if (!isset($_POST['nb_champs'])){
$_POST['nb_champs'] = 1;
}
// si la personne clic sur "un champs en +", on ajoute un champs
if (isset($_POST['submit']) && $_POST['submit'] == "Un champs en +"){
$_POST['nb_champs']++;
}

// on affiche le formulaire
echo '<FORM METHOD="post">';
// on place un champ caché contenant un entier ayant comme valeur le nombre de champs du formulaire
echo '<INPUT TYPE="hidden" NAME="nb_champs" VALUE="'.$_POST['nb_champs'].'">';

// on affiche tous les champs du formulaire
for ($i=1; $i<=$_POST['nb_champs']; $i++){
echo '<INPUT TYPE="text" name="champs_'.$i.'"><br />';
}

// on place un bouton permettant de rajouter un champs
echo '<INPUT TYPE="submit" NAME="submit" VALUE="Un champs en +"><br />';
// on place un bouton permettant de soumettre le formulaire
echo '<INPUT TYPE="submit" NAME="submit" VALUE="Envoyer">';
echo '</FORM>';
}
?>


Alors, convaincu ?
LoadingChargement en cours