PHP Refactoring – Lez. 1: proprietà di una classe
Quando scriviamo una classe ognuno di noi usa delle sue convezioni.
Io consiglio di utilizzare le seguente sulle proprietà di una classe:
- Se composta da singola parola tutto in minuscolo; per esempio $nome;
- Se composta da più parole la prima lettera di ciascuna, a partire dalla seconda, in maiuscolo, tutte le altre minuscole; per esempio $nomeAziendaItaliana;
- Se rappresenta una costante composta da singola parola scriverla tutta in maiuscolo; per esempio ELEMENTI;
- Se abbiamo una costante composta da più parole scriverla tutta in maiuscolo con un trattino fra le parole; per esempio ELEMENTI_PER_RIGA
- Il nome della variabile deve essere autoesplicativo
Tutte le proprietà di una classe sono private ed è possibile accedervi tramite i metodi getXXX e setXXX, il cui livello di accesso deve essere public, in modo che si possa accedere allo stato interno dell’oggetto da qualunque punto. Al posto di XXX mettiamo il nome della proprietà.
Di seguito è fornito un esempio per meglio chiarire il concetto:
| Errato | Esatto |
|
class Prova { public $nomeclasse; private $mia_x1; const costante_della_classe; const pagine; } |
class Prova { private $nomeClasse; private $miaDataDiNascita; const COSTANTE_DELLA_CLASSE; const PAGINE; public function setNomeClasse($nome) { $this->nomeClasse = $nome; } public function getNomeClasse() { return $this->nomeClasse; } } |
Ma perchè dobbiamo fare tutto questo ? Le proprietà di una classe rappresentano lo stato dell’istanza di un oggetto, quindi si deve accedere solamente tramite i metodi pubblici, deputati a scatenare le azioni per la modifica.
Un esempio reale è la lampadina: noi siamo interessati al suo stato, ovvero incandescente o fredda, ma agiamo su quest’ultimo tramite le azioni accendere e/o spegnere, le quali rappresentano i nostri metodi.
Per quanto riguarda l’accesso delle proprietà in PHP 5 possiamo usare un trucchetto, possibile grazie alle funzioni magiche __set e __get.
Se non vogliamo usare direttamente nel codice le funzioni getXXX e setXXX possiamo fare come nel seguente esempio:
|
class Prova { private $_nomeClasse; public function __set($nome, $valore) { call_user_func(array($this, “set”.ucwords($nome)), $valore); } public function __get($nome) { call_user_func(array($this, “get”.ucwords($nome))); } public function setNomeClasse($nome) { $this->_nomeClasse = $nome; } public function getNomeClasse() { return $this->_nomeClasse; } } $obj = new Prova(); $obj->nomeClasse = ‘prova’; echo $obj->nomeClasse; |
Il trucco consiste nel seguire una certa nomenclatura nei nomi ed usufruire delle funzioni magiche del linguaggio.
Il nome che utilizziamo al di fuori della classe non è altro che la proprietà, ma senza l’underscore come primo carattere. Non esistendo una variabile di classe con tale nome, il PHP lancia la funzione __set o __get, se esistenti, passandogli nel primo caso nome proprietà e valore da immagazzinare, nel secondo caso solo il nome.
Requisito essenziale per il funzionamento è che:
- la variabile fittizia utilizzata al di fuori dell’oggetto segua la naming convenction della proprietà interna alla classe, ad esclusione dell’underscore che non deve essere presente;
- esistano i metodi setXXX e getXXX per la proprietà richiamata;
- la variabile interna da utilizzare sia semplice, in quanto con un array il funzionamento non sarà come lo si desidera.
Nel caso dell’array vedremo quali metodi utilizzare in un prossimo articolo.
Un grazie ad Enrico per alcuni utili suggerimenti nella stesura del codice.
























Loading ...





Rispondi