我正在看PSR-7接口並考慮如何實現它們。我也一直在閱讀this blog post。顯然,實現PSR-7
接口的對象必須是不可變的。如果我實現從MessageInterface
的withProtocolVersion
方法Psr7 Http消息,爲什麼不可變?
所以那麼它會是這個樣子:
public function withProtocolVersion($version)
{
if ($this->protocol === $version)
{
return $this;
}
$new = clone $this;
$new->protocol = $version;
return $new;
}
我真正的問題是,爲什麼不變?爲什麼不簡單地做一個return $this;
?
這不是我關心它分配的內存量,我真的沒有看到任何好處,保持它不可變。
像博客文章說,當你這樣做:
$request = $request
->withMethod('POST')
->withUrl(new Url('http://example.org/')
->withHeader('Content-Type', 'text/plain');
然後四個副本的創建,但最終的結果在$request
是一樣的,當我會簡單地使用return $this
,對不對?
爲什麼決定保持它不變。那麼,爲什麼我必須做一個clone $this
?它有什麼好處?
我真的沒有想到這個想法。
博客文章該部分的最後一段說:_這個決定是爲了健壯的緣故。這顯然會「刪除整個類的錯誤」。@ – Barmar
@Barmar我真的不明白他的意思。我真的不知道它會如何去除整個類的bug。那麼,如何刪除一類錯誤?你仍然可以*「設置」*所有的屬性。它所做的只是返回對象的新副本,而不是它自己的對象。 – Vivendi