【问题标题】:date_add() changing 2 variables in PHP rather than 1date_add() 在 PHP 中更改 2 个变量而不是 1 个
【发布时间】:2014-04-01 10:18:28
【问题描述】:

这是我使用的代码示例:

<?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。

【问题讨论】:

    标签: php dateadd


    【解决方案1】:

    clone 关键字就是您所需要的。

    $date2 = clone $date1;
    

    当一个对象被克隆时,一个对象所有属性的浅拷贝。任何引用其他变量的属性都将保持引用。

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

    Source

    【讨论】:

      【解决方案2】:

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

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

      $date2 = clone $date1;
      

      在这种情况下,您还可以使用 DateTimeImmutable 接口(在 5.5 中引入),它会在您尝试修改它时创建新实例,例如使用-&gt;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'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 2017-08-20
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-24
        • 1970-01-01
        相关资源
        最近更新 更多