Return 具有当前状态的对象实例
Return object instance with current state
有什么区别吗
$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);
如果我没记错的话,克隆时会生成两个不同的对象。
举个例子,如果你这样做
$test = new TestCase;
$test->setState(1)->setState(2);
$test->getState();
那么你使用的是什么克隆,答案是 none,因为 $test
是原始对象,它实际上从未设置过状态。其他 2 个克隆在方法链的末尾被丢弃。
方法链可能return正确的值,但是如果你把对象$test
放到不同的范围,比如
function a(){
$this->test = new TestCase;
$this->test->setState(1)->setState(2);
}
function b(){
echo $this->test->setState(3);
}
然后test一直不知道其他2个状态,就像我说的那样有些毫无意义。
通常情况下,如果您在设置一些初始值后分叉对象,您会希望克隆该对象。一个例子就像查询构建器,您可以在其中构建查询然后克隆它以执行单独的查询来计算结果(例如减去限制或顺序)
$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 子句等有多个连接和多个部分,这将很有用。
$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);
如果我没记错的话,克隆时会生成两个不同的对象。
举个例子,如果你这样做
$test = new TestCase;
$test->setState(1)->setState(2);
$test->getState();
那么你使用的是什么克隆,答案是 none,因为 $test
是原始对象,它实际上从未设置过状态。其他 2 个克隆在方法链的末尾被丢弃。
方法链可能return正确的值,但是如果你把对象$test
放到不同的范围,比如
function a(){
$this->test = new TestCase;
$this->test->setState(1)->setState(2);
}
function b(){
echo $this->test->setState(3);
}
然后test一直不知道其他2个状态,就像我说的那样有些毫无意义。
通常情况下,如果您在设置一些初始值后分叉对象,您会希望克隆该对象。一个例子就像查询构建器,您可以在其中构建查询然后克隆它以执行单独的查询来计算结果(例如减去限制或顺序)
$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 子句等有多个连接和多个部分,这将很有用。