|
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
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:
viene interpretato come
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"
|
|