【发布时间】:2016-09-19 20:05:40
【问题描述】:
有什么区别
$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);
【问题讨论】:
-
什么是区别,一个是$this,另一个是$this的克隆。克隆就像副本,它是重复的。如果您的意思是值相同,那么副本就是副本,如果您复制文件并重命名它的内容相同......是的,直到它们分歧。现在,如果您检查此
spl_object_hash,它们就不一样了。 -
您的示例中的唯一区别在于,如果您从不将状态应用于原始 this 而仅应用于克隆,那么它们显然已经分歧了。这就像复制文件,然后在不更改原始文件的情况下编辑复制的文件。克隆后它们变成 2 个独立的不同实体。
-
@ArtisiticPhoenix 我刚刚添加了我所在的上下文。感谢您的快速回复。
-
我建议避免克隆,原因是你失去了“状态”,因为你基本上是在撒谎而不是改变原始对象,这可能会导致以后出现意外的值。想象一下添加一个方法
getState,以及什么对象的状态。它不必要地使事情复杂化,并对代码的可读性产生负面影响。也就是说,在这种情况下,值将是相同的,但稍后您将使用$test而不是它的克隆。 -
简而言之,这是没有意义的,因为您没有存储克隆,因此无法在调用设置之外维护该状态,这意味着您不妨只使用您原来的局部变量喂了方法开始。因为您没有保留克隆的状态。