domenica 29 aprile 2012

Introduzione al PHP: Il parsing delle variabili nei letterali stringa

I letterali stringa tra doppi apici, come anche i blocchi di testo che si comportano come letterali stringa tra doppia apici senza i doppi apici, possono accogliere al loro interno il nome di variabili. Tali variabili sono valutate in fase d'interpretazione del letterale, e il nome sostituito con il relativo contenuto. Per l'integrazione di variabili nei letterali stringa esistono due sintassi. La sintassi semplice permette con poco sforzo di inserire una variabile in un letterale stringa. Ad esempio:

$numero = 10;
$stringa = "Ti ho pensato $numero volte";



Come abbiamo detto, essendo la stringa racchiusa tra doppi apici, il simbolo $ nel letterale, se non preceduto dal carattere di escape, è interpretato come inizio del nome di una variabile. Quindi l'interprete PHP cerca di catturare quanti più caratteri possibile per formare il nome della variabile (compresi i -> per gli oggetti e [] per gli array). Nell'esempio, PHP cattura solo la parola "numero" perché, come abbiamo appreso nel post "Nomi di Variabili" lo spazio non può far parte del nome di una variabile. E' quindi valutato $numero ed il letterale memorizzato in $stringa è "Ti ho pensato 10 volte".

In sostanza è come se il codice precedente fosse stato scritto nella forma:

$numero = 10;
$stringa = "Ti ho pensato ".$numero." volte";

Nota: l'operatore punto in PHP serve a concatenare le stringhe.

Nel caso di variabili array con indice stringa, l'indice stesso non va racchiuso tra apici. Ad esempio:

$arr = array("nome"=>"Ciro","cognome"=>"Pellegrino");
$stringa = "Il mio nome è $arr[nome]";
Nota: gli array saranno trattati nel prossimo post 

Esistono comunque dei casi d'incertezza, ad esempio quando una parola segue immediatamente il nome della variabile o l'espressione è più complessa del semplice accesso ad una variabile, array (i cui indici sono anch'essi individuati da un nome di variabile o array multidimensionale), ecc.. In tali circostanze si ricorre alla sintassi complessa che fa uso delle parentesi graffe. Ad esempio, scrivendo:

$p="pre";
$stringa = "Questo è $pvisto ma è solo un $ptesto"; //Errore

In questo caso le due variabili intercettate da PHP sono $pvisto e $ptesto invece di $p, dando luogo ad un risultato indesiderato. Per risolvere questa ambiguità, ed identificare con esattezza inizio e soprattutto fine del nome della variabile, è possibile racchiudere il nome della variabile tra parentesi graffe:

$p="pre";
$stringa = "Questo è {$p}visto ma è solo un {$p}testo"; 
//ottengo: "Questo è previsto me è solo un pretesto"

Attenzione , fra { e $ non devono essere presenti spazi altrimenti la { è interpretata come il simbolo parentesi graffa. E' quindi la sequenza {$ che da inizio all'identificazione precisa della variabile con fine certa specificata dalla parentesi }. Se poi si desidera indicare il letterale {$ in una stringa tra doppi apici occorre far precedere il $ dal carattere di escape: {\$ è interpretato come la sequenza letterale di simboli {$.

La forma complessa, sebbene un po' più lunga, è quella più sicura per esprimere una variabile all'interno di un letterale stringa, poiché la variabile è espressa come si farebbe all'interno del comune codice php e non da adito ad errate interpretazioni. Nel caso dell'array avremo:

$arr = array("nome"=>"Ciro","cognome"=>"Pellegrino");
$stringa = "Il mio nome è {$arr['nome']}";