Si definisce scope di una variabile l’ambiente in cui essa è definita
e nel quale è disponibile per il programmatore.
La maggior parte delle variabili PHP ha uno scope unico che comprende
il file nel quale esse sono state dichiarate. Tuttavia questo
ambiente si espande fino a comprendere i file inclusi e richiesti.
Per esempio nel frammento di codice riportato di seguito
$var=10;
include “file.inc”;
la variabile $var sarà visibile anche all’interno
del file file.inc.
Si noti che, tuttavia, per le variabili introdotte nelle funzioni
definite dal programmatore, si utilizza uno scope locale; ovvero
ogni variabile definita all’interno di una funzione ha per
default un ambiente limitato alla funzione di definizione. Per
esempio il codice
$var = ”Ciao, mondo”;
Function Scope()
{
echo $var;
}
Scope();
non produrrà alcun output in quanto la variabile $var usata
all’interno della funzione Scope() non è la stessa
di quella usata al suo esterno, ma una sua omonima con scope locale
alla funzione. Non essendo essa mai stata inizializzata, la chiamata
ad echo non produrrà alcun effetto visibile.
Per utilizzare all’interno di una funzione delle variabili
provenienti dall’esterno, occorre dichiararle come global.
Facciamo un esempio:
$a = ”Ciao ”;
$b = ”Mondo”;
$c = ””;
Function Concatena()
{
global $a, $b, $c;
$c = $a . $b;
}
Concatena();
echo $c;
In questo caso l’output ottenuto è quello atteso in quanto
tutti i riferimenti alle variabili dichiarate global punteranno
alle versioni dichiarate all’esterno della funzione. Non
ci sono limiti alle variabili che possono essere dichiarate globali.
Importante: si noti che in questo caso PHP si discosta
dalla sintassi del linguaggio C, in cui le variabili globali sono
subito disponibili all’interno delle funzioni. Pongano molta
attenzione a questo aspetto gli utenti che hanno esperienza in
quel linguaggio di programmazione per non incorrere in inspiegabili
mal funzionamenti.
Un secondo modo per accedere a delle variabili globali è tramite
il vettore $GLOBALS. Si tratta di un array associativo
predefinito contenente tutte le variabili globali. Esse sono accessibili
indicizzando il vettore attraverso il nome della variabile.
Riscriviamo il codice precedente utilizzando l’array $GLOBALS:
$a = ”Ciao ”;
$b = ”Mondo”;
$c = ””;
Function Concatena()
{
$GLOBALS[“c”] = $GLOBALS[“a”].$GLOBALS[“b”];
}
Concatena();
echo $c;
L’output di questa nuova versione del nostro script d’esempio
sarà identico a quello della precedente.
Un’altra importante caratteristica della visibilità di una
variabile è la staticità. Una variabile statica è visibile solo
nell’ambiente definito dalla funzione in cui essa è utilizzata,
ma non perde il valore assunto quando l’esecuzione del programma
esce da tale ambiente.
A titolo esplicativo consideriamo una funzione che incrementa
il valore di una variabile ogni qual volta essa viene chiamata:
Function Incrementa()
{
$a = 0;
echo $a;
$a++;
}
Così come è scritta, questa funzione è del tutto inutile in quanto
ogni volta che è chiamata setta a zero la variabile $a e stampa
tale valore. L’istruzione
$a++;
che incrementa il suo valore non procura alcun effetto in quanto
$a sarà deallocata al termine della funzione.
Per sortire l’effetto desiderato, ed implementare un contatore,
occorre che la variabile mantenga il valore assunto anche all’uscita
della funzione. Una variabile che gode di questa proprietà è detta
statica e deve essere dichiarata con la parola chiave static.
Forniamo di seguito una versione corretta della precedente funzione
facente uso di una variabile statica:
Function Incrementa()
{
static $a = 0;
echo $a;
$a++;
}
Le variabili statiche forniscono inoltre un mezzo elegante per
trattare le funzioni ricorsive. Una funzione ricorsiva è una funzione
che chiama se stessa. Un esempio di funzione ricorsiva è la funzione
matematica fattoriale(N) dove N è un numero intero. Quando
si scrive una funzione ricorsiva occorre porre molta attenzione
affinché la ricorsione non sia infinita ma esista un modo corretto
per terminarla. Molto spesso, infatti, una ricorsione infinita,
oltre a fare imbestialire gli insegnanti di informatica, ha effetti
deleteri sul corretto funzionamento del sistema.
Il nostro corso continuerà con la prossima lezione il cui argomento
saranno ancora le variabili in PHP.
Torna all'indice Generale del corso di Corso di PHP di Software Planet