Variabili
Come tutti i linguaggi di programmazione, PHP necessita dell'uso di variabili per poter memorizzare dei valori durante l'esecuzione del codice.
Come abbiamo visto nel
Vademecum esisono fondamentalmente due tipi di variabili, semplici e array. Altresì questi due tipi di varibili si suddividono in altre due "subcategorie" fondamentali:
- variabili locali
- variabili globali
Come si può intuire dal nome, le prime sono variabili che esistono e "vivono" all'interno della parte di codice in cui vengono utilizzate, le altre invece sono variabili che "vivono" in una qualsiasi parte di codice.
Per entrare nel dettaglio e capire la differenza, prendiamo un semplice esempio di codice:
$_var = "Benvenuto";
function test() {
$_var = "Arrivederci";
}
test();
print $_var;
In questo semplicissimo esempio abbiamo la prima riga di codice che imposta una variabile semplice con un valore, successivamente abbiamo una funzione che imposta una variabile con un altro valore.
Il codice prosegue con il richiamo della funzione che setta il secondo valore ad una variabile dopodiché viene stampato il valore della variabile.
Qual'è il risultato del nostro script?
Chi è alle prime armi con PHP gli verrebbe da dire:
Arrivederci, invece no, il risultato del nostro programma è
Benvenuto!
Ma come? Se è stata richiamata la funzione che cambiava valore alla nostra varibile?
Invece no! Ecco svelato l'arcano delle variabili locali. Per PHP la variabile
$_var contenuta nella funzione non è la variabile
$_var definita prima di questa.
Una funzione viene considerata come una parte di codice a se stante rispetto al codice della pagina, quindi tutte le variabili utilizzate al loro interno rimangono locali alla funzione, a meno che non definiamo che quelle variabili sono globali.
PHP 5 utilizza il modo di dichiarare le variabili come avviene per il Linguaggio C, ma noi vediamo invece la tecnica utilizzata fino alla versione 4 (e compatibile con la 5):
GLOBAL.
Se dovesimo rivedere il codice rendendo globale la nostra variabile, il codice diventerebbe:
$_var = "Benvenuto";
function test() {
global $_var;
$_var = "Arrivederci";
}
test();
print $_var;
Abbiamo semplicemente dichiarato globale la nostra variabile all'interno della funzione, quindi qualsiasi operazione influenzer` la nostra variabile si riperquoterà per tutto il programma.
Ora il risultato del nostro programma sarà proprio
Arrivederci.
Oltre alla dichiarazione delle nostre variabili come globali, in PHP esistono parecchie variabili globali generate dal motore stesso. Queste variabiabili sono sempre variabili array contenenti moltissimi valori che possono servire nella programmazione.
Ecco l'elenco delle variabili globali generate da PHP:
$GLOBALS
contiene i riferimenti ad ogni variabile globale che viene gestita nel programma. Esiste sin dalla versione PHP 3
$_SERVER
contiene tutti i riferimenti inseriti dal server Apache per l'esecuzione del programma. Sostituisce il vecchio array $HTTP_SERVER_VARS
$_GET
contiene tutti i riferimenti agli elementi inviati al programma trami codifica GET. Sostituisce il vecchio array $HTTP_GET_VARS
$_POST
contiene tutti i riferimenti agli elementi inviati al programma trami codifica POST. Sostituisce il vecchio array $HTTP_POST_VARS
$_COOKIE
contiene tutti i riferimenti ai cookie inviati dal client. Sostituisce il vecchio array $HTTP_COOKIE_VARS
$_FILE
contiene tutti i riferimenti al/ai file inviati al server tramite un form. Sostituisce il vecchio array $HTTP_POST_VARS
$_ENV
contiene tutti i riferimenti alle variabili di ambiente. Sostituisce il vecchio array $HTTP_ENV_VARS
$_REQUEST
racchiude tutte le variabili GET, POST e COOKIE. Prima della versione PHP 4.1.0 non esisteva nessun riferimento
$_SESSION
contiene tutti i riferimenti alle variabili di sessione di PHP. Sostituisce il vecchio array $HTTP_SESSION_VARS
Non sto a ripetere tutto quello che dice il manuale PHP in merito a queste variabili globali, ma se qualcuno fosse interessato ad approfondire questo argomento può
andare sul sito di PHP.
Queste variabili essendo generate da PHP sono globali e quindi possono essere usate in qualsiasi funzione senza doverle dichiarare prima.
Attenzione, dato che sono variabili si possono modificare e quindi potreste falsare il valore reale (relativamente all'esecuzione del programma). Fate attenzione quando le usate.
Per evitare che PHP stampi a video delgi alert (che non sono errori ma solo avvisi), che lui chiama
Notice:, è buona norma utilizzare sempre gli apici quando si richiama un variabile array, sia locale che globale:
print $_SERVER[REMOTE_ADDR]; // genera il Notice di PHP
print $mioarray[nome]; // genera il Notice di PHP
print $_SERVER['REMOTE_ADDR']; // modo corretto di scrivere
print $mioarray['nome']; // modo corretto di scrivere
Imparate ad usare sempre gli apici quando avete a che fare con gli array, evitere problemi con le release future di PHP, anche perchè già molti parametri sono stati eliminati con l'avvento di PHP 6.
Uno degli elementi che in PHP 5 esiste ma impotato a
false (overo inattivo) mentre in PHP 6 è stato eliminato definitivamente è
register_globals presente nel file di configurazione di PHP (php.ini).
Questo parametro permetteva che qualsiasi variabile input (quindi in ingresso) inviata alla pagina, veniva convertita in variabile globale di PHP.
Ad esempio veniva inviata una URl con i seguenti parametri:
pagina.ph?nome=php&cognome=versione5 tali parametri venivano convertiti automaticamente in variabili:
$nome e
$cognome.
Oltre che a creare confusione con eventuali variabili locali personali, creava anche problemi a livello di sicurezza dello script stesso.
Se trovate script ancora scritti in quel modo, sappiate che a partire da PHP 5 (ma anche nelle versioni precedenti dove non abilitato) non funzioneranno più e bisogna convertirli con le nuove tecniche, ovvero prendendo l'esempio di prima avremo:
$_GET['nome'] e
$_GET['cognome'].
Un'altra cosa che volevo dirvi relativa all'uso delle variabili riguarda un po' il modo discriverle e di utilizzarle (rivedremo questo anche nella sezione riguardante la pulizia del codice):
è inutile creare tante variabili, duplicarle o quant'altro sia uno spreco di risorse del sistema; scrivere
$nome = $_POST['nome'];
print $nome;
è assolutamente inutile; risulta un perdita di tempo, uso di risorse maggiori (immagintelo su centinaia di righe di codice) per nulla. Scrivete semplicemente
print $_POST['nome'];
è esattamente la stessa identica cosa. L'associazione può andar bene nel qualcaso dobbiamo poi operare sulla variabile, cioé quando dobbiamo modificarne il valore per non perdere riferimento al valore originale.
Per ora è tutto, eventuali altri suggerimenti all'uso delle variabili verranno dati in altri capitoli ove c'è ne sia l'esigenza.