Php 克隆对象,有什么区别?

Php 克隆对象,有什么区别?,php,Php,我们为什么要克隆对象?有什么区别?当我们克隆对象时,幕后发生了什么?可能使用低资源创建另一个对象?当您需要对象的副本时,可以克隆对象。如果只传递对对象的引用,则该对象仍然是相同的。这就是为什么您可以更改对象的属性,并使该更改在使用同一对象的任何地方都可见。克隆时,不创建引用,而是创建一个精确副本。更改副本中的属性不会更改原始属性 让我们看看下面的代码: $a = new MyClas(); $a->myProperty = 'Hello World'; $b = $a $b->my

我们为什么要克隆对象?有什么区别?当我们克隆对象时,幕后发生了什么?可能使用低资源创建另一个对象?

当您需要对象的副本时,可以克隆对象。如果只传递对对象的引用,则该对象仍然是相同的。这就是为什么您可以更改对象的属性,并使该更改在使用同一对象的任何地方都可见。克隆时,不创建引用,而是创建一个精确副本。更改副本中的属性不会更改原始属性

让我们看看下面的代码:

$a = new MyClas(); 
$a->myProperty = 'Hello World';
$b = $a
$b->myProperty = 'See You';

echo $a->myProperty . ' / ' . $b->myProperty;
这将打印“再见/再见”

不,让我们看看这个例子

$a = new MyClas(); 
$a->myProperty = 'Hello World';
$b = clone $a
$b->myProperty = 'See You';

echo $a->myProperty . ' / ' . $b->myProperty;

结果将是“你好,世界/再见”

相当广泛的问题

为什么?

在这种情况下,我想要一个介于两天前和两天后的日期范围:

$dateInterval = DateInterval('P2D');
$date1 = new DateTime();
$date2 = clone $date1;
$date1->sub($dateInterval);
$date2->add($dateInterval);
可以轻松获取日期范围的两端。。。。是的,我可以将
$date2
实例化为
newdatetime()而不是克隆;但是如果我需要在克隆之前对$date1做一些额外的修改,而$date2也需要基于这些修改,那么克隆就容易多了,而且不需要重新进行
额外的修改


我不能做
$date2=$date1
,因为这只是对同一个对象的引用,对其中一个对象所做的任何操作都会自动对另一个对象进行,因为它是一个引用;但是克隆创建了一个副本,它本身就是一个独特的实例

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


这样做的好处是可以自动复制所有属性。将原始对象的每个属性复制到新对象时,不必写出所有代码。如果向类中添加新属性,则不必更新手动复制属性的所有位置。

。有时我克隆对象,例如,我想从SwiftMailer向不同的人发送同一封电子邮件的多个副本。或者我想获取一个
DateTime
对象,然后在不修改原始
DateTime
对象的情况下向其添加
。很多可能性。嗯,我明白了,我走错了方向:)谢谢。很好的例子。谢谢为什么他们总是否决我?PHP文档中有一部分是关于克隆的。通常在询问之前先查看文档。因此,也许这是很好的,我现在看到了克隆的好的一面。克隆将生成原始对象的唯一版本。