【发布时间】:2018-03-01 10:10:39
【问题描述】:
我最近不得不使用Slim\Http\Message 和Slim\Http\Request 来获取用户发布的数据。
我注意到 withBody() 方法中的某些内容返回对象的克隆而不是 $this。
这给我带来了一些麻烦,因为在我将 $request->withBody(...) 分配给一个变量 ($request) 并在我的脚本中继续使用该新变量之前,我无法让我的应用程序工作。
我有一个模拟示例来解释(见代码中的 cmets);
class Request {
protected $body;
public function addBody($body) {
$clone = clone $this;
$clone->body = $body;
return $clone;
}
public function getBody() {
return $this->body;
}
}
$request = new Request;
// this will return NULL
$request->addBody([
'name' => 'john',
'email' => 'john@example.com',
]);
var_dump($request->getBody());
// -----------------------
// but this will return the "body" that was passed in above.
$request = $request->addBody([
'name' => 'john',
'email' => 'john@example.com',
]);
var_dump($request->getBody());
我明白这里发生了什么。但我不明白为什么一个类会这样实现。
有什么好处?为什么要这样限制开发者?
【问题讨论】:
-
您可能想研究“Immutable Objects”。
-
和函数式编程
-
基于意见投票结束。试试softwareengineering.stackexchange.com我不能投票把它迁移到那里
-
不是基于意见的,他想了解不可变值对象的设计模式