A mio parere, gli oggetti dovrebbero essere immutabili per gli oggetti valore. A parte questo, non ha molti vantaggi a meno che tu non condivida il tuo oggetto su tutta la tua applicazione.
C'è qualche risposta errata qui, un oggetto immutabile può avere setter. Ecco alcune implementazioni di oggetti immutabili in PHP.
Esempio n. 1.
class ImmutableValueObject
{
private $val1;
private $val2;
public function __construct($val1, $val2)
{
$this->val1 = $val1;
$this->val2 = $val2;
}
public function getVal1()
{
return $this->val1;
}
public function getVal2()
{
return $this->val2;
}
}
Come si può vedere una volta istanziato non è possibile modificare alcun valore.
Esempio 2: con setters
:
class ImmutableValueObject
{
private $val1;
private $val2;
public function __construct($val1, $val2)
{
$this->val1 = $val1;
$this->val2 = $val2;
}
public function getVal1()
{
return $this->val1;
}
public function withVal1($val1)
{
$copy = clone $this;
$copy->val1 = $val1;
return $copy; // here's the trick: you return a new instance!
}
public function getVal2()
{
return $this->val2;
}
public function withVal2($val2)
{
$copy = clone $this;
$copy->val2 = $val2;
return $copy;
}
}
V'è possibile vari implementazione e questo non è affatto un elenco esclusivo. E ricorda che con Reflection c'è sempre un modo per aggirarlo in PHP, quindi l'immutabilità è tutta nella tua testa alla fine!
Spesso è anche buona norma mettere gli oggetti immutabili come finali.
EDIT:
- cambiato setX per withX
- commenti su finale
fonte
2015-11-25 02:52:00
aggiunto Vedete alcun beneficio nell'avere classi che fanno questo? Probabilmente ritengo che un approccio migliore sarebbe semplicemente quello di negare * l'instabilità * (sì l'ho inventata) su proprietà che non si desidera modificare, costringendole a creare una nuova istanza, se necessario. EDIT: Sì, cosa ha detto ThiefMaster :) –
http: // StackOverflow.it/questions/7317037/php-immutable-public-member-fields questo esempio può aiutare a comprendere –