Programmazione
Asp
Asp.NET
Java
Javascript
Php
Oracle

Svaghi
Ascolta Radio
Faccine
Libri
Links

Varie
Cerca nel sito...
Segnalazioni
Scrivimi


Variabili di variabili

Non tutti sanno che in PHP il contenuto di una variabile, e di una espressione in generale, può essere interpretato a sua volta come un nome di variabile, e come tale utilizzato.
In PHP i nomi di variabili sono prefissati dal simbolo $ (dollaro); di conseguenza risulta immediato capire che l'istruzione $a="Messaggio"; assegna la stringa "Messaggio" ad una variabile di nome a. Se la variabile a era già stata utilizzata, il suo valore precedente verrà sostituito da "Messaggio"; se a viene utilizzata per la prima volta, invece, verrà creata ex-novo una variabile associata a tale nome.
Il contenuto della variabile a, tuttavia, può essere interpretato anche in modo diverso e cioè come nome di variabile. Vediamo un esempio:

// Assegno alla variabile 'a' la stringa "Messaggio"
$a="Messaggio";
$$a="Saluti"; // ... E adesso?

Come si è detto, il simbolo $ prefissa i nomi di variabile. Si noti, però, che nell'ultima riga dell'esempio precedente il "dollaro" compare due volte! Quello che succede è che la parte dell'espressione che segue il primo $ (cioè $a) viene interpretata come un nome di variabile, nome che in questo caso non è altro che il valore della variabile a. Per intenderci

$$a="Saluti";

viene interpretato come

$Messaggio="Saluti"; // $a="Messaggio"

Abbiamo definito, quindi, una variabile di nome Messaggio a cui abbiamo assegnato il valore "Saluti".
Questo meccanismo, noto come nomi variabili di variabili (variable variables), consente in pratica di utilizzare una qualsiasi espressione come nome di variabile. Ad esempio:

${"$a2"}="Saluti";

viene interpretato come

$Messaggio2="Saluti";

in quanto viene dapprima valutata la sotto-espressione tra parentesi graffe, "$a2", che restituisce Messaggio2, e poi tale stringa viene usata come nome di variabile nell'assegnamento.

Nell'esempio precedente si è fatto uso di parentesi graffe che, nel caso dei nomi variabili di variabile, vengono utilizzate per delimitare le sotto-espressioni da valutare per risolvere eventuali ambiguità, possibili soprattutto se si utilizzano degli array.
Ad esempio, l'espressione $$a[1] è ambigua, in quanto è impossibile per il parser capire se si voleva usare come nome di variabile il valore della sotto-espressione $a[1] (elemento di indice 1 dell'array a)considerare l'elemento di indice 1 dell'array $$a (cioè dell'array il cui nome è contenuto in a)La sintassi corretta che risolve l'ambiguità è ${$a[1]} nel primo caso e ${$a}[1] nel secondo.
Mi affido ad un esempio per cercare di chiarire questo guazzabuglio.

$a = array ("zero", "uno", "due");
$uno = "Numero uno";
echo "<p>" . ${$a[1]} . "</p>"; // Questo stampa "Numero uno"

$b = "a";
echo "<p>" . ${$b}[1] . "</p>"; // Questo stampa "uno"