Looking for php Answers? Try Ask4KnowledgeBase
Looking for php Keywords? Try Ask4Keywords

PHP Accès dynamique à une variable par nom (variables variables)


Exemple

Les variables sont accessibles via des noms de variables dynamiques. Le nom d'une variable peut être stocké dans une autre variable, ce qui permet son accès dynamique. Ces variables sont appelées variables variables.

Pour transformer une variable en variable variable, vous mettez un $ supplémentaire devant votre variable.

$variableName = 'foo';
$foo = 'bar';

// The following are all equivalent, and all output "bar":
echo $foo;
echo ${$variableName};
echo $$variableName;

//similarly,
$variableName  = 'foo';
$$variableName = 'bar';

// The following statements will also output 'bar'
echo $foo; 
echo $$variableName; 
echo ${$variableName};

Les variables variables sont utiles pour mapper des appels de fonction / méthode:

function add($a, $b) {
    return $a + $b;
}

$funcName = 'add';

echo $funcName(1, 2); // outputs 3

Cela devient particulièrement utile dans les classes PHP:

class myClass {
    public function __construct() {
        $functionName = 'doSomething';
        $this->$functionName('Hello World');
    }

    private function doSomething($string) {
        echo $string; // Outputs "Hello World"
    }
}

Il est possible, mais pas obligatoire, de mettre $variableName entre {} :

${$variableName} = $value;

Les exemples suivants sont à la fois équivalents et en sortie "baz":

$fooBar = 'baz';
$varPrefix = 'foo';

echo $fooBar;               // Outputs "baz"
echo ${$varPrefix . 'Bar'}; // Also outputs "baz"

Utiliser {} n'est obligatoire que lorsque le nom de la variable est lui-même une expression, comme ceci:

${$variableNamePart1 . $variableNamePart2} = $value;

Il est néanmoins recommandé de toujours utiliser {} , car il est plus lisible.

Bien qu'il ne soit pas recommandé de le faire, il est possible de chaîner ce comportement:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

Il est important de noter que l'utilisation excessive de variables variables est considérée comme une mauvaise pratique par de nombreux développeurs. Comme ils ne sont pas bien adaptés à l'analyse statique par les IDE modernes, les bases de code volumineuses comportant de nombreuses variables variables (ou invocations de méthodes dynamiques) peuvent rapidement devenir difficiles à gérer.


Différences entre PHP5 et PHP7

Une autre raison de toujours utiliser {} ou () est que PHP5 et PHP7 ont une manière légèrement différente de traiter les variables dynamiques, ce qui entraîne des résultats différents dans certains cas.

En PHP7, les variables dynamiques, les propriétés et les méthodes seront désormais évaluées strictement dans l’ordre de gauche à droite, par opposition au mélange de cas spéciaux en PHP5. Les exemples ci-dessous montrent comment l'ordre d'évaluation a changé.

Cas 1: $$foo['bar']['baz']

  • Interprétation PHP5: ${$foo['bar']['baz']}
  • Interprétation de PHP7: ($$foo)['bar']['baz']

Cas 2: $foo->$bar['baz']

  • Interprétation PHP5: $foo->{$bar['baz']}
  • Interprétation de PHP7: ($foo->$bar)['baz']

Cas 3: $foo->$bar['baz']()

  • Interprétation PHP5: $foo->{$bar['baz']}()
  • Interprétation PHP7: ($foo->$bar)['baz']()

Cas 4: Foo::$bar['baz']()

  • Interprétation PHP5: Foo::{$bar['baz']}()
  • Interprétation PHP7: (Foo::$bar)['baz']()