克隆对象,有什么区别?

时间:2015-01-29 16:44:32

标签: php

我们为什么要克隆对象?有什么区别?克隆对象时幕后发生了什么?也许使用低资源制作另一个对象?

3 个答案:

答案 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)

克隆一个对象只是复制它。幕后没有什么特别的事情发生。

好处是复制所有属性是自动的。您不必写出所有代码来将原始对象的每个属性复制到新对象。如果您向该类添加新属性,则无需更新手动复制属性的所有位置。