martedì 17 aprile 2012

Introduzione al PHP: Variabili

Come hai avuto modo di vedere nel post Cos'è una Classe, un oggetto memorizza il proprio stato nei campi.

private $pedalata = 0;
private $velocita = 0;
private $marcia   = 1;

Nonostante questa piccola introduzione ai campi, hai sicuramente delle domande del tipo:
  • Quali sono regole e convenzioni per i nomi delle variabili? 
  • Esistono dei tipi di dati per le variabili? 
  • È assegnato un valore di default alle variabili non esplicitamente inizializzate? 

Nei prossimi post sarà data risposta a queste domande, ma prima, ci sono un paio di distinzioni tecniche di cui prendere coscienza. Spesso il termine campo e variabile sono utilizzati indifferentemente divenendo fonte di confusione per chi si approccia al PHP sfruttando la OOP, giacché spesso sembrano riferirsi alla stessa cosa.

In PHP possiamo distinguere i seguenti tipi di variabili:
  • Variabili d’Istanza (Campi Non Statici)
    Tecnicamente parlando, gli oggetti memorizzano il proprio stato in “campi non statici”, cioè, campi dichiarati senza la parola chiave static. I campi non statici sono anche conosciuti come variabili d’istanza perché i loro valori sono unici in ogni istanza di una classe (in ogni oggetto, in altre parole); la $velocita di una bicicletta è indipendente dalla $velocita di un’altra.
  • Variabili di Classe (Campi Statici)
    Una variabile di classe è qualunque campo dichiarato utilizzando il modificatore static; questo dice all'interprete che c’è esattamente una copia di questa variabile, indipendentemente dal numero di istanze utilizzate. Un campo che definisce il numero di marce per un particolare tipo di bicicletta potrebbe essere marcato come static dato che concettualmente lo stesso numero di marce è applicato a tutte le istanze.  Il codice static private $numeroMarce=6; creerebbe tale campo statico. 
  • Variabili LocaliCosì come un oggetto memorizza lo stato in un campo, un metodo memorizza il proprio stato temporaneo in variabili locali. A differenza dei campi, le variabili locali non devono essere dichiarate, ma possono essere direttamente utilizzare (per esempio $contatore=10;). La determinazione di una variabile come locale avviene valutando il punto in cui la variabile è utilizzata – tra le parentesi graffe di apertura e chiusura di un metodo o funzione. Come tali, le variabili locali sono visibili ai metodi in cui sono dichiarate; non sono accessibili dal resto della classe. Per convenzione occorre inizializzare una variabile locale prima del suo utilizzo.
  • Variabili Globali
    Hai già visto degli esempi di variabili globali nel progetto DemoBicicletta nella fase di creazione dei due oggetti $bici1 = new Bicicletta(); $bici2 = new Bicicletta();. $bici1 e $bici2 sono due variabili globali. Come per le variabili locali, non hanno bisogno di dichiarazione e la loro determinazione come variabili globali avviene valutando il punto in cui sono utilizzate  –  nel corpo principale dello script. Queste variabili sono definite globali perché accessibili da qualunque funzione o metodo. Perché un metodo possa accedere ad una variabile globale occorre dichiaralo. Tale dichiarazione prevede l'inserimento del codice   global $nomeVarGlobale; all'interno del metodo (tra le parentesi graffe di apertura e chiusura e comunque prima dell'utilizzo della variabile). L'utilizzo di variabili globali all'interno dei metodi è da evitare perché non necessario ed in alcune circostanze dannoso.
  • ParametriHai già visto esempi di parametri, nella classe Bicicletta come nella dichiarazione del metodo cambiaPedalata che è public function cambiaPedalata($nuovoValore). La variabile $nuovoValore è il parametro di questo metodo. La cosa importante da ricordare è che i parametri sono sempre classificati come “variabili” e non “campi”.
Quindi, quando si parla di campi e variabili, se si parla di “campi in generale” (escludendo variabili locali e parametri), possiamo semplicemente dire “campi”. Se quanto detto si applica a “tutti i precedenti”, si può parlare semplicemente di “variabili”. Se il contesto richiede una distinzione, è utilizzato il termine specifico appropriato (campo statico, variabile locale, ecc.). Occasionalmente ci si potrà anche imbattere nel termine “membro”.  Campi e metodi di un tipo (classe) sono collettivamente chiamati i suoi membri.