L’ambito di una variabile rappresenta il contesto in cui essa è definita, ogni variabile ha il suo scope (ambito). Innanzitutto le variabili hanno scopo nella pagina in cui risiedono. Se definiamo $myVar, il resto della pagina può accedere a $myVar, ma le altre pagine generalmente no.
Inclusioni
Dal momento che i files inclusi agiscono come se fossero parte integrante dell’originale, le variabili definite prima della linea include()
oppure require()
sono disponibili nel file incluso. Inoltre, le variabili definite all’interno del file incluso sono disponibili per il genitore dopo la linea include()
.
//inc.php <?php $b = 11; echo "Il valore di a è $a
"; ?> //tets.php <?php $a = 10; include 'inc.php'; echo $a + $b; ?>
L’esempio, totalmente privo di senso, rende l’idea. La variabile $a definita in test.php prima dell’inclusione è disponibile nel file incluso. La variabile $b dichiarata in inc.php, è disponibile in test.php dopo l’inclusione.
Funzioni
Le funzioni definite dall’utente hanno il loro ambito. Qualsiasi variabile definita all’interno di una funzione, è di default limitata all’ambito locale della funzione, non sarà quindi disponibile all’infuori di essa, inoltre, le variabili definite all’infuori di essa non sono disponibili all’interno.
Per questo motivo, una variabile all’interno di una funzione può avere lo stesso nome di una al di fuori di essa, sarà una variabile del tutto diversa, con un valore diverso.
<?php $a = 1; function local() { $b = 2; echo $a; } test(); echo $b; ?>
Il seguente esempio non produrrà alcun output (anzi genererà due notice error) in quanto stiamo tentando di utilizzare all’interno della funzione local()
la variabile $a a cui non è stato assegnato nessun valore all’interno del suo ambito, ed al di fuori di essa la variabile locale $b, definita all’interno della funzione.
Rendere le variabili globali
Per modificare lo scope delle variabili all’interno di una funzione, è possibile utilizzare la parola chiave global
.
<?php $name = 'Simone'; function test() { global $name; $name .= ' Grimani'; } test(); echo $name; // Simone Grimani ?>
Dichiarando $name come global
all’interno della funzione farà si che tutti i riferimenti alla variabile faranno riferimento alla versione globale.
Possiamo ottenere lo stesso risultato utilizzando anche lo spaciale array $GLOBALS
. Si tratta di una array associativo predefinito in PHP, dove il nome della variabile sarà la chiave dell’array, mentre il contenuto il suo valore.
L’array $GLOBALS
è disponibile in qualsiasi ambito perchè fa parte della variabili superglobals.
<?php $name = 'Simone'; function test() { $GLOBALS['name'] .= ' Grimani'; } test(); echo $name; // Simone Grimani ?>
Variabili static
Come detto le variabili dichiarate all’interno di una funzione, di default, hanno scopo locale, inoltre queste variabili svaniscono non appena la funzione è terminata. Questo vuol dire che ad una successiva chiamata della funzione sarà creata una nuova variabile.
Le variabili dichiarate come static
, continueranno ad esistere solo nello scopo della funzione, ma conserveranno il loro valore anche quando la funzione sarà terminata (quindi quando il programma abbandonerà il loro scopo). Consideriamo il seguente esempio:
<?php function test() { $counter = 0; return $counter ++; } echo 'Chiamata nr ' . test() . '
'; echo 'Chiamata nr ' . test() . '
'; echo 'Chiamata nr ' . test() . '
'; ?>
L’output di questo script non sarà quello sperato, difatti ad ogni chiamata la variabile $counter perderà il suo valore restituendo sempre come risultato ‘0’. Consideriamo ora:
function test() { static $counter = 0; return $counter ++; } echo 'Chiamata nr ' . test() . '
'; echo 'Chiamata nr ' . test() . '
'; echo 'Chiamata nr ' . test() . '
'; ?>
Questa volta $counter sarà inizializzata soltanto alla prima chiamata della funzione, mentre alle chiamate successive manterrà il vecchio valore, aumentandolo correttamente di una unità.
Le variabili statiche sono particolarmente indicate nelle funzioni ricorsive, cioè in funzioni che richiamano se stesse al loro interno (usare con cautela). Difatti uno dei rischi principali nell’uso di funzioni ricorsive è di effettuare ricorsioni infinite. Le variabili statiche possono rappresentare un valido strumento per terminare la ricorsione.
Conclusioni
Comunque è quasi sempre meglio non usare le variabili globali all’interno di una funzione. Le funzioni devono essere progettate in modo da ricevere ogni valore di cui hanno bisogno come argomento e restituire i valori che devono essere restituiti. Basandosi su variabili globali all’interno di una funzione le rende più dipendenti dal contesto, e di conseguenza meno utili.
Inoltre l’ambito locale di una variabile, soprattutto in script di grandi dimensioni, rendere il codice più facile da gestire e più semplice da debuggare.