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

时间:2014-04-01 10:18:29

标签: 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($date2, "Y-m-d")."<br/>";
?>

结果如下:

Date 1: 2014-05-05
Date 2: 2014-05-05

我期待的结果是:

Date 1: 2014-04-05
Date 2: 2014-05-05

如何获得预期结果并解决此问题? 我只能使用PHP,HTML和CSS,所以请不要使用jQuery或Javascript。

2 个答案:

答案 0 :(得分:3)

clone关键字是您所需要的。

$date2 = clone $date1;

克隆对象时,是所有对象属性的浅表副本。任何引用其他变量的属性都将保留引用。

如果您的对象$date2拥有对其使用的另一个对象$date1的引用,并且当您复制父对象时,您想要创建此另一个对象的新实例,以便副本具有自己的对象单独复制。

Source

答案 1 :(得分:3)

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

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

$date2 = clone $date1;

在这种情况下,您还可以使用DateTimeImmutable接口(在5.5中引入),它会在您尝试修改时创建新实例,例如:使用->add()

$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'));