返回具有当前状态的对象实例

时间:2016-05-23 04:16:41

标签: php this instance clone

之间是否有任何差异
$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);

2 个答案:

答案 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子句等多个部分,这是有用的。