Sto osservando le interfacce PSR-7 e sto pensando a come implementarle.Psr7 Http Message, perché immutabile?
Ho letto anche this blog post. Apparentemente gli oggetti che implementano le interfacce PSR-7
devono essere immutabili.
Quindi, se a implementare il metodo withProtocolVersion
da MessageInterface
allora sarebbe simile a questa:
public function withProtocolVersion($version)
{
if ($this->protocol === $version)
{
return $this;
}
$new = clone $this;
$new->protocol = $version;
return $new;
}
La mia domanda è veramente, perché immutabili? Perché non fare semplicemente un return $this;
?
Non è che sono preoccupato per la quantità di memoria allocata, ma non vedo alcun vantaggio nel mantenerlo immutabile.
Come i post del blog dice, quando si esegue questa operazione:
$request = $request
->withMethod('POST')
->withUrl(new Url('http://example.org/')
->withHeader('Content-Type', 'text/plain');
Poi vengono creati quattro copie, ma il risultato finale in $request
è la stessa di quando vorrei semplicemente utilizzare return $this
, giusto?
Perché è stata presa la decisione di mantenerlo immutabile. Quindi, perché devo fare un clone $this
? Qual è il vantaggio di questo?
Non ho davvero capito l'idea.
L'ultimo paragrafo di quella sezione del post del blog dice: _ Questa decisione è stata presa per motivi di robustezza. Questo a quanto pare "rimuoverebbe un'intera classe di bug" ._ – Barmar
@Barmar Non capisco davvero cosa intenda.Non vedo davvero come sarebbe * rimuovere un'intera classe di bug *. Quindi, come * dovrebbe * rimuovere una classe di bug? Sei ancora in grado di * "impostare" * tutte le proprietà. L'unica cosa che fa è restituire una nuova copia dell'oggetto invece dell'oggetto stesso. – Vivendi