PHP Acceso a una variable dinámicamente por nombre (variables variables)


Ejemplo

Se puede acceder a las variables a través de nombres de variables dinámicas. El nombre de una variable se puede almacenar en otra variable, lo que permite acceder a ella de forma dinámica. Tales variables son conocidas como variables variables.

Para convertir una variable en una variable, coloque un $ extra en frente de su 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};

Las variables variables son útiles para mapear funciones / llamadas de método:

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

$funcName = 'add';

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

Esto se vuelve particularmente útil en las clases de PHP:

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

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

Es posible, pero no es necesario poner $variableName entre {} :

${$variableName} = $value;

Los siguientes ejemplos son tanto equivalentes como de salida "baz":

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

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

Usar {} solo es obligatorio cuando el nombre de la variable es en sí mismo una expresión, como esta:

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

Sin embargo, se recomienda usar siempre {} , porque es más legible.

Si bien no se recomienda hacerlo, es posible encadenar este comportamiento:

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

Es importante tener en cuenta que el uso excesivo de variables variables es considerado como una mala práctica por muchos desarrolladores. Debido a que no son muy adecuados para el análisis estático de los IDE modernos, las grandes bases de código con muchas variables (o invocaciones de métodos dinámicos) pueden convertirse rápidamente en difíciles de mantener.


Diferencias entre PHP5 y PHP7

Otra razón para usar siempre {} o () , es que PHP5 y PHP7 tienen una forma ligeramente diferente de tratar con variables dinámicas, lo que resulta en un resultado diferente en algunos casos.

En PHP7, las variables dinámicas, las propiedades y los métodos ahora se evaluarán estrictamente en el orden de izquierda a derecha, a diferencia de la combinación de casos especiales en PHP5. Los siguientes ejemplos muestran cómo ha cambiado el orden de evaluación.

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

  • Interpretación de PHP5: ${$foo['bar']['baz']}
  • Interpretación de PHP7: ($$foo)['bar']['baz']

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

  • Interpretación de PHP5: $foo->{$bar['baz']}
  • Interpretación de PHP7: ($foo->$bar)['baz']

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

  • Interpretación de PHP5: $foo->{$bar['baz']}()
  • Interpretación de PHP7: ($foo->$bar)['baz']()

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

  • Interpretación de PHP5: Foo::{$bar['baz']}()
  • Interpretación de PHP7: (Foo::$bar)['baz']()