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 de pouvoir utiliser les variables dynamiques avec les tableaux, vous avez à résoudre un problème ambigu. Si vous écrivez $$a[1], l'analyseur a besoin de savoir si vous parler de la variable qui a pour nom $a[1] ou bien si vous voulez l'index [1] de la variable $$a. 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 le scope depuis lequel l'appel s'effectue. Par exemple, si vous avez une expression de la forme $foo->$bar, alors le scope local sera examiné 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 {
var $bar = 'I am bar.';
var $arr = array('I am A.', 'I am B.', 'I am C.');
var $r = 'I am r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('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 :
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.