date_add()在PHP中更改2个变量而不是1个

date_add()在PHP中更改2个变量而不是1个,php,dateadd,Php,Dateadd,下面是我使用的代码示例: <?php date_default_timezone_set("Europe/London"); $date1 = date_create("2014-04-05"); $date2 = $date1; date_add($date2, new DateInterval("P1M")); echo "Date 1: ".date_format($date1, "Y-m-d")."<br/>"; echo "Date 2: ".date_format

下面是我使用的代码示例:

<?php 
date_default_timezone_set("Europe/London");
$date1 = date_create("2014-04-05");
$date2 = $date1;
date_add($date2, new DateInterval("P1M"));
echo "Date 1: ".date_format($date1, "Y-m-d")."<br/>";
echo "Date 2: ".date_format($date2, "Y-m-d")."<br/>";
?>
我期待的结果是:

Date 1: 2014-04-05
Date 2: 2014-05-05
如何获得预期结果并修复此问题? 我只能使用PHP、HTML和CSS,所以请不要使用jQuery或Javascript。

你需要的是
clone
关键字。 克隆对象时,对象所有属性的浅层副本。任何引用其他变量的属性都将保留为引用

如果您的对象
$date2
包含对它使用的另一个对象
$date1
的引用,并且当您复制父对象时,您希望创建该另一个对象的新实例,以便复制副本具有自己的单独副本


这是由于自PHP5以来对象是如何通过引用分配的;指定后,对一个对象所做的更改也会反映在另一个对象中

通用解决方案是克隆对象:

$date2 = clone $date1;
在这种情况下,您还可以使用接口(在5.5中介绍),该接口在您尝试修改时创建新实例,例如使用
->add()

$date2 = clone $date1;
$date2 = clone $date1;
$date1 = new DateTimeImmutable('2014-04-05');
$date2 = $date1;

$date2 = $date2->add(new DateInterval('P1M'));

echo "Date 1: ".date_format($date1, "Y-m-d")."<br/>";
echo "Date 2: ".date_format($date2, "Y-m-d")."<br/>";
$date1 = new DateTimeImmutable('2014-04-05');
$date2 = $date1->add(new DateInterval('P1M'));