Ich schaue mir die PSR-7 Schnittstellen an und denke über einen Weg nach, wie man sie implementiert.Psr7 Http Message, warum unveränderlich?
Ich habe auch gelesen this blog post. Offensichtlich müssen die Objekte, die die Schnittstellen PSR-7
implementieren, unveränderbar sein.
Also, wenn ich die withProtocolVersion
Methode von MessageInterface
implementieren, dann wäre es in etwa so aussehen:
public function withProtocolVersion($version)
{
if ($this->protocol === $version)
{
return $this;
}
$new = clone $this;
$new->protocol = $version;
return $new;
}
Meine Frage ist wirklich, warum unveränderlich? Warum nicht einfach eine return $this;
?
Es ist nicht so, dass ich über die Menge an Speicher besorgt bin, die es zuweist, ich sehe wirklich keinen Vorteil darin, es unveränderlich zu halten.
Wie die Blog-Posts sagen, wenn Sie dies tun:
$request = $request
->withMethod('POST')
->withUrl(new Url('http://example.org/')
->withHeader('Content-Type', 'text/plain');
Dann vier Kopien erstellt werden, aber das Ergebnis Ende in $request
ist das gleiche wie wenn ich einfach return $this
verwenden würde, nicht wahr?
Warum ist die Entscheidung getroffen, es unveränderlich zu halten. Also, warum muss ich eine clone $this
machen? Was bringt das?
Ich bin nicht wirklich auf die Idee, es zu starten.
Der letzte Abschnitt dieses Abschnitts des Blogposts sagt: _Diese Entscheidung wurde aus Gründen der Robustheit getroffen. Das würde "eine ganze Klasse von Fehlern entfernen". – Barmar
@Barmar Ich verstehe nicht wirklich, was er damit meint.Ich sehe nicht wirklich, wie es * eine ganze Klasse von Bug * entfernen würde. Also, wie * würde * das eine Klasse von Fehlern entfernen? Sie können alle Eigenschaften noch "festlegen" *. Es wird nur eine neue Kopie des Objekts anstelle des Objekts selbst zurückgegeben. – Vivendi