Ricerca personalizzata

PHP Refactoring – Lez. 1: proprietà di una classe

Pubblicato da Nicola in Refactoring

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.


del.icio.us:PHP Refactoring - Lez. 1: proprietà di una classe digg:PHP Refactoring - Lez. 1: proprietà di una classe spurl:PHP Refactoring - Lez. 1: proprietà di una classe wists:PHP Refactoring - Lez. 1: proprietà di una classe simpy:PHP Refactoring - Lez. 1: proprietà di una classe newsvine:PHP Refactoring - Lez. 1: proprietà di una classe blinklist:PHP Refactoring - Lez. 1: proprietà di una classe furl:PHP Refactoring - Lez. 1: proprietà di una classe reddit:PHP Refactoring - Lez. 1: proprietà di una classe fark:PHP Refactoring - Lez. 1: proprietà di una classe blogmarks:PHP Refactoring - Lez. 1: proprietà di una classe Y!:PHP Refactoring - Lez. 1: proprietà di una classe smarking:PHP Refactoring - Lez. 1: proprietà di una classe magnolia:PHP Refactoring - Lez. 1: proprietà di una classe segnalo:PHP Refactoring - Lez. 1: proprietà di una classe gifttagging:PHP Refactoring - Lez. 1: proprietà di una classe oknotizie:PHP Refactoring - Lez. 1: proprietà di una classe

Rispondi

Enter this code