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 子句等有多个连接和多个部分,这将很有用。