[英]PHP chaining of methods and CLONE
我对某事感到好奇。
一位受人尊敬的开发人员建议使用“ return clone $ this”而不是简单地使用“ return $ this”,他最终离开了开源项目一段时间,从未回答我的“为什么?” 问题,所以我很好奇它是否有任何好处。
因此,以普通的可链接方法为例,我们可能会有类似以下内容:
function setProperty($arg) {
this->property = $arg;
return $this;
}
他的例子更像这样:
function setProperty($arg) {
this->property = $arg;
return clone $this;
}
我的印象是他错了,因为要做的就是在无法访问的每一步都复制对象。
因此,如果我们使用他的方法并说有类似这样的事情...
class foo {
public $value;
function setA($arg) {
$this->value = $arg;
return clone $this;
}
function setB($arg) {
$this->value = $arg;
return clone $this;
}
function setB($arg) {
$this->value = $arg;
return clone $this;
}
function print() {
print $this->value;
}
}
我们有这样一行($ obj是foo类的实例):
$obj->setA('a')->setB('b')->setC('c')->print();
无论使用克隆$ this还是仅使用$ this进行打印,最终都应打印c。
然而...
$obj->setA('a')->setB('b')->setC('c');
$obj->print();
应该打印一个,因为只有第一步会更改原始对象。 第二步将更改第一步中的克隆对象,第三步将更改第二步中传递给它的对象。
但是如果您继续使用,则再一次:
$obj = $obj->setA('a')->setB('b')->setC('c');
$obj->print();
我相信这也会在任何一种方法中打印c。
如果我们最初将$ value声明为静态,则所有这些不同的变体都应打印c。
如果我理解这些东西如何工作,我相信我是正确的,并且看到使用“ return clone $ this”相对于“ return $ this”绝对没有好处。 还是我错过了某些东西,或者我在上述假设中完全错了?
谢谢!
罗德尼
我认为您永远不想修改当前对象的状态然后返回一个克隆。 相反,您将克隆然后进行修改。 例,
class Foo {
private $value;
function setValue($arg) {
$clone = clone $this;
$clone->value = $arg;
return $clone;
}
function printValue() {
echo $this->value.PHP_EOL;
}
}
这样,您的对象就变得不可变。
用法示例:
$a = (new Foo)->setValue('a');
$b = $a->setValue('b');
$a->printValue();
$b->printValue();
这将打印
a
b
这样$a
不与当你“修改”搞砸$b
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.