PHP: implementare classi immutabili

Short link

Il concetto di classe immutabile è mutuato da linguaggi di programmazione completamente OO come Java e riguarda il modo in cui lo stato di una classe non cambia nel corso dell'esecuzione del codice. In questo articolo vedremo come implementare le classi immutabili in PHP.

Lo stato di una classe dipende dal valore assunto dalle sue proprietà. Supponiamo di dover implementare una classe che calcoli il valore IVA di un totale.

Un'implementazione comune sarebbe la seguente:

class Vat {
    const RATE = 22;
    public $total;
    private $vatValue;
    public $totalVat;

    public function __construct($tot) {
        $this->vatValue = ((self::RATE / 100) + 1);
        $this->total = $tot;
    }

    public function setValue() {
        $this->totalVat = ($this->total * $this->vatValue);
    }

    public function getValue() {
        return $this->totalVat;
    }
  }                  

Questa classe è mutabile per due motivi: la proprietà totalVat può essere modificata dall'esterno direttamente e tramite lo specifico metodo setter:


    $myVat = new Vat(100); 
    $myVat->totalVat = 200;

Una modifica indesiderata compromette quindi l'intera funzionalità della classe.

Per rendere immutabile questa classe occorre eliminare la visibilità pubblica dei setter e delle proprietà sensibili e lasciare solo il getter necessario ai client dell'API di questa classe:

 class Vat { 
   const RATE = 22; 
   private $total; 
   private $vatValue; 
   private $totalVat;

   public function __construct($tot) {
     $this->vatValue = ((self::RATE / 100) + 1);
     $this->total = $tot;
     $this->setValue();
    }

 private function setValue() {
    $this->totalVat = ($this->total * $this->vatValue);
 }

public function getValue() {
    return $this->totalVat;
}
} 

In questo modo lo stato della classe, rappresentato dal totale calcolato, resta immutato.

Conclusioni

Le classi immutabili possono essere implementate in PHP tramite gli operatori di visibilità. Si tratta di un approccio che permette di mantenere risultati coerenti preservando le classi da modifiche indesiderate.

L'autore

Gabriele Romanato, sviluppatore web full stack specializzato in siti, applicativi web ed e-commerce con Node.js e PHP.