Buona sera,

vorrei spendere alcune parole sui patterns PHP, cosi ho pensato di stilare una serie di post dove verranno esaminati alcuni dei più utili e famosi patterns finora elaborati.

Al giorno d'oggi credo che moltissimi programmatori a livello OOP facciano largo uso di patterns che possono facilitare la vita.
Essendo i design patterns delle ottimali risoluzioni a problemi comuni di programmazione, credo che una analisi dei più comuni possa essere d'aiuto a molti.

Oggi come primo pattern vediamo ObjectValue
Quando ci riferiamo ai "value object" parliamo di oggetti non molto complessi la cui egualianza in riferimento ad altri oggetti si basa sui valori assegnati ai suoi campi e non sulla sua identità.

In parole più semplici:
Prendiamo il caso di avere 2 utenti con lo stesso nome e nessun campo ID che ci permette di distinguerne l'identità. Questi due oggetti sono "value object" perchè la loro ugualianza si basa sui valori assegnati alle proprietà (il nome).

- A livello teorico se noi associassimo un identità (ID) ai due utenti improvvisamente ci ritroviamo per le mani due entità ma ne parleremo più avanti nei prossimi post.

Un'altra caratteristica del "value object" è la sua immutabilità, questo significa semplicemente che una volta che i sui campi sono stati popolati con i valori, questi non si possono più cambiare.

Dopo questa prefazione teorica iniziamo a mettere mano al codice e vedrete che sarà tutto molto più chiaro.

L'intento di questo esempio è quello di spiegare come creare "value object" che potrebbero esistere in un ambiente reale.
Prenderemo quindi in considerazione una ipotetica classe URL
Codice PHP:
final class url {

    private 
$scheme;
    private 
$host;
    private 
$path;
    private 
$querystring;

    public function 
__construct$url ) {
        if ( !
filter_var$urlFILTER_VALIDATE_URL, array( FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIRED ) ) ) {
            throw new 
Exception"L'url he hai specificato non è valido!" );
        }

        
$url parse_url$url );
        
$this->scheme $url['scheme'];
        
$this->host $url['host'];

        if ( isset( 
$url['path'] ) ) {
            
$this->path $url['path'];
        }

        if ( isset( 
$url['query'] ) ) {
            
$this->queryString $url['query'];
        }
    }

Classe molto semplice, abbiamo un url in ingresso e lo scomponiamo popolando le proprietà dell'oggetto. Niente di alieno
L'aspetto importante da notare qui, oltre alla semplicità del codice, è l'immutabilità del nostro "value object", una volta assegnati i valori non possiamo più modificarli.

Nel prossimo post vediamo di aggiungere qualche getter alla nostra classe per renderla più carina