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 :
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 :
À 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 :
produira le même affichage que :
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, si 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.