Corso di PHP

Scope delle variabili

 

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