我们为什么要克隆对象?有什么区别?克隆对象时幕后发生了什么?也许使用低资源制作另一个对象?
答案 0 :(得分:2)
在需要对象副本时克隆对象。如果传递一个对象只传递它的引用,则该对象仍然是相同的。这就是您可以更改对象属性的原因,并且在您使用同一对象的任何位置都可以看到该更改。克隆时,您不创建引用,而是创建精确副本。更改副本中的属性不会更改原始属性。
让我们看看以下代码:
$a = new MyClas();
$a->myProperty = 'Hello World';
$b = $a
$b->myProperty = 'See You';
echo $a->myProperty . ' / ' . $b->myProperty;
这将打印“See You / See You”
不要看这个例子
$a = new MyClas();
$a->myProperty = 'Hello World';
$b = clone $a
$b->myProperty = 'See You';
echo $a->myProperty . ' / ' . $b->myProperty;
结果将是“Hello World / See You”
答案 1 :(得分:0)
相当广泛的问题......
为什么?
情况,我想要两天前和两天之间的日期范围:
$dateInterval = DateInterval('P2D');
$date1 = new DateTime();
$date2 = clone $date1;
$date1->sub($dateInterval);
$date2->add($dateInterval);
可以轻松获得日期范围的两端....是的,我可以将$date2
实例化为new DateTime();
而不是克隆;但是如果我需要在克隆之前对$ date1做一些额外的修改,并且$ date2也需要基于这些更改,那么克隆就容易得多,并且不需要重做{{ 1}}
我不能additional modifications
因为它只是对同一个对象的引用,对一个对象进行的任何操作都会自动完成,因为它是一个引用;但克隆会创建一个副本,它本身就是一个独特的实例
答案 2 :(得分:0)
克隆一个对象只是复制它。幕后没有什么特别的事情发生。
好处是复制所有属性是自动的。您不必写出所有代码来将原始对象的每个属性复制到新对象。如果您向该类添加新属性,则无需更新手动复制属性的所有位置。