之间是否有任何差异
$this->state = $state;
return $this;
和
$instance = clone $this;
$instance->state = $state;
return $instance;
背景:
class TestCase {
/**
* State
*/
private $state;
/**
* Set state
*/
function setState($state) {
$this->state = $state;
return $this;
// Or
// $instance = clone $this;
// $instance->state = $state;
// return $instance;
}
}
$test = new TestCase;
$test->setState($state1)->setState($state2);
答案 0 :(得分:0)
如果我没弄错的话,你克隆时会产生两个不同的对象。
答案 1 :(得分:0)
如果你这样做就是一个例子
$test = new TestCase;
$test->setState(1)->setState(2);
$test->getState();
然后你使用什么克隆,答案是没有,因为$test
是原始对象,它从来没有真正拥有它的状态集。其他2个克隆在方法链的末尾被丢弃。
方法链可能会返回正确的值,但如果您将对象$test
放入其他范围,例如
function a(){
$this->test = new TestCase;
$this->test->setState(1)->setState(2);
}
function b(){
echo $this->test->setState(3);
}
然后测试从未知道其他两个状态,正如我所说的那样是一些毫无意义的状态。
通常,如果您在设置一些初始值后将其分叉,则需要克隆对象。一个示例就像一个查询构建器,您可以在其中构建查询,然后克隆它以执行单独的查询来计算结果(例如减去限制或顺序)
$Qb = new QueryBuilder();
$Qb->select('*')->table('posts')->where( 'published', '<', '2014-02-20' );
//copy and diverge to count results,
$tQb = clone $Qb;
$tQb->select('COUNT(id) AS total');
$total = $tQb->getResult();
// add limits to original instance.
$Qb->limit('20');
$rows = $Qb->getResult();
请参阅克隆将用于保存设置查询的初始部分,然后根据个人需要复制和分散它们。一个计算总结果一个拉有限数量的结果。如果你有几个连接和where子句等多个部分,这是有用的。