我正在看PSR-7 https://github.com/php-fig/http-message/tree/master/src接口并思考如何实现它们。
我也一直在读这篇博文 http://evertpot.com/psr-7-issues/。显然,实现该功能的对象PSR-7
接口必须是不可变的。
所以如果我实施withProtocolVersion
方法来自MessageInterface
那么它看起来像这样:
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
, right?
为什么决定保持它不变。那么为什么我必须做一个clone $this
?它有什么好处呢?
我并没有真正理解它背后的想法。
我建议你阅读这个文件 http://www.php-fig.org/psr/psr-7/meta/,其中详细解释了所有设计选择。
您特别应该阅读Why value objects?
和New instances vs returning $this
部分。
关键点如下:
本质上,将 HTTP 消息建模为值对象可确保消息状态的完整性,并防止需要双向依赖关系,而双向依赖关系通常会不同步或导致调试或性能问题。
and
这些操作也可以使用值对象来完成,具有许多好处:
- 原始请求状态可以被存储以供任何消费者检索。
- 可以使用默认标头和/或消息正文来创建默认响应状态。
如果您想深入挖掘,我建议您查看无花果邮件列表的历史记录(您可以找到它here https://groups.google.com/forum/?fromgroups#!forum/php-fig),其中有很多关于对象的不变性的讨论
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)