我如何深入复制DateTime对象?

$date1 = $date2 = new DateTime(); $date2->add(new DateInterval('P3Y')); 

现在$date1$date2包含相同的date – 三年后。 我想创build两个单独的date时间,一个是从一个string中parsing出来的,另一个是三年后添加的。 目前我已经黑了,像这样:

 $date2 = new DateTime($date1->format(DateTime::ISO8601)); 

但这似乎是一个可怕的黑客。 是否有一个“正确的”方法来深入复制DateTime对象?

 $date1 = new DateTime(); $date2 = new DateTime(); $date2->add(new DateInterval('P3Y')); 

更新:

如果要复制而不是引用现有的DT对象,请使用clone ,not =

$a = clone $b;

用克隆操作符克隆date:

 $date1 = new DateTime(); $date2 = clone $date1; $date2->add(new DateInterval('P3Y')); 

克隆默认是浅的,但足够深的DateTime。 在您自己的对象中,您可以定义__clone()魔术方法来克隆父对象更改时有意克隆的属性(即子对象)。

(我不知道为什么文档认为需要克隆一个对象的一个​​很好的例子是GTK。谁在PHP中使用GTK?)

PHP 5.5.0引入了DateImmutable 。 添加和修改这个类的方法返回新的对象。

 $date1 = new DateTimeImmutable(); $date2 = $date1->add(new DateInterval('P3Y')); 

您应该将DateTime更改为DateTimeImmutable

 // from date time $date = \DateTimeImmutable::createFromMutable($mutableDate) 

那么你可以调用DateTime任何方法,而不用担心它的改变