Les variables dynamiques

Il est pratique d'avoir parfois des noms de variables qui sont variables. C'est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. Une variable classique est affectée avec l'instruction suivante :

<?php
$a
= 'bonjour';
?>

Une variable dynamique prend la valeur d'une variable et l'utilise comme nom d'une autre variable. Dans l'exemple ci-dessous, bonjour peut être utilisé comme le nom d'une variable en utilisant le "$$" précédent la variable. C'est-à-dire :

<?php
$$a = 'monde';
?>

À ce niveau, deux variables ont été définies et stockées dans l'arbre des symboles PHP : $a avec comme valeur "bonjour" et $bonjour avec comme valeur "monde". Alors, l'instruction :

<?php
echo "$a {$$a}";
?>

produira le même affichage que :

<?php
echo "$a $bonjour";
?>

c'est-à-dire : bonjour monde.

Afin d'utiliser des variables variables avec des tableaux, un problème d'ambiguïté doit être résolu. En effet, si l'analyseur rencontre $$a[1], il doit déterminer si $a[1] devait être utilisé comme une variable, ou si $$a était attendu comme la variable, suivi de l'indice [1] de cette variable. La syntaxe pour résoudre cette ambiguïté est la suivante : ${$a[1]} pour le premier cas et ${$a}[1] pour le deuxième.

On peut également accéder aux propriétés d'une classe en utilisant les noms des variables. Le nom de la variable sera résolu en utilisant la portée depuis laquelle l'appel s'effectue. Par exemple, s'il y a une expression de la forme $foo->$bar, alors la portée locale sera examinée pour $bar et sa valeur sera utilisée comme nom pour la propriété de $foo. Ce comportement reste valide si $bar est un tableau.

Les accolades peuvent aussi être utilisées pour clairement délimiter le nom de la propriété. Ceci est utile lors de l'accès à des valeurs d'une propriété qui contient un tableau, lorsque le nom de la propriété est composé de plusieurs parties, ou lorsque le nom de la propriété contient des caractères non valides (i.e. depuis la fonction json_decode() ou SimpleXML).

Exemple #1 Exemple de propriété variable

<?php
class Foo {
public
$bar = 'I am bar.';
public
$arr = ['I am A.', 'I am B.', 'I am C.'];
public
$r = 'I am r.';
}

$foo = new Foo();
$bar = 'bar';
$baz = ['foo', 'bar', 'baz', 'quux'];
echo
$foo->$bar . "\n";
echo
$foo->{$baz[1]} . "\n";

$start = 'b';
$end = 'ar';
echo
$foo->{$start . $end} . "\n";

$arr = 'arr';
echo
$foo->{$arr[1]} . "\n";
echo
$foo->{$arr}[1] . "\n";
?>

L'exemple ci-dessus va afficher :

     I am bar.
     I am bar.
     I am bar.
     I am r.
     I am B.
    

Avertissement

Notez que les variables dynamiques ne peuvent pas être utilisées avec les tableaux Superglobaux dans une fonction ou une classe. La variable $this est aussi une variable spéciale qui ne peut être référencée dynamiquement.