PHP Accesso a una variabile in modo dinamico per nome (variabili variabili)

Esempio

Le variabili sono accessibili tramite nomi di variabili dinamiche. Il nome di una variabile può essere memorizzato in un'altra variabile, consentendone l'accesso dinamico. Tali variabili sono note come variabili variabili.

Per trasformare una variabile in una variabile variabile, metti un extra $ messo davanti alla tua variabile.

$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};

Le variabili variabili sono utili per mappare chiamate di funzioni / metodi:

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

$funcName = 'add';

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

Questo diventa particolarmente utile nelle classi PHP:

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

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

È possibile, ma non è necessario inserire $variableName tra {} :

${$variableName} = $value;

I seguenti esempi sono sia equivalenti che di output "baz":

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

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

L'utilizzo di {} è obbligatorio solo quando il nome della variabile è di per sé un'espressione, come questa:

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

Si consiglia comunque di usare sempre {} , perché è più leggibile.

Anche se non è consigliabile farlo, è possibile concatenare questo comportamento:

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

È importante notare che l'uso eccessivo di variabili variabili è considerato una cattiva pratica da molti sviluppatori. Dal momento che non sono adatti per l'analisi statica dei moderni IDE, grandi basi di codici con molte variabili variabili (o invocazioni di metodi dinamici) possono diventare rapidamente difficili da mantenere.


Differenze tra PHP5 e PHP7

Un altro motivo per usare sempre {} o () , è che PHP5 e PHP7 hanno un modo leggermente diverso di trattare le variabili dinamiche, il che si traduce in un risultato diverso in alcuni casi.

In PHP7, le variabili dinamiche, le proprietà e i metodi verranno ora valutati rigorosamente in ordine da sinistra a destra, al contrario del mix di casi speciali in PHP5. Gli esempi seguenti mostrano come è cambiato l'ordine di valutazione.

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

  • Interpretazione di PHP5: ${$foo['bar']['baz']}
  • Interpretazione di PHP7: ($$foo)['bar']['baz']

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

  • Interpretazione di PHP5: $foo->{$bar['baz']}
  • Interpretazione di PHP7: ($foo->$bar)['baz']

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

  • Interpretazione di PHP5: $foo->{$bar['baz']}()
  • Interpretazione di PHP7: ($foo->$bar)['baz']()

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

  • Interpretazione di PHP5: Foo::{$bar['baz']}()
  • Interpretazione di PHP7: (Foo::$bar)['baz']()