DateTime Modify() php如何影响之前的变量?

5

我遇到了一个奇怪的问题,与DateTime的modify()函数有关。

我开始有一个DateTime,例如:2018-08-07 12:00,和要添加的天数,例如:2。

我将dateTime(在变量$startDt中)复制到一个新变量($date)中,以便它不受任何更改的影响。

modify()函数工作正常。我得到了2018-08-09 12:00。但是,我想重复使用相同的起始日期,但是添加一个新的数字。比如+3。

但是它总共添加了5!我检查了一下,当在$date上使用modify()时,它会以某种方式同时更改$startDt。

有人能向我解释这个奇迹吗?:))如何应用函数于变量2会影响变量1?即使变量2最初是变量1的克隆;它们应该是两个独立的实体...

while ($x < $duration) {

        $date = $startDt;
        echo "$startDt before:" . $startDt->format('Y-m-d') . "<br>";
        $date = $date->modify('+' . $x . 'day');
        echo "$startDt after:" . $startDt->format('Y-m-d') . "<br>";

        $x++;

    }

结果:

$startDt before +2 : 2018-08-08
$startDt after: 2018-08-10
$startDt before +3 : 2018-08-10
$startDt after: 2018-08-13

我将dateTime(在变量$startDt中)复制到一个新变量($date)中,以便它不受任何更改的影响。很遗憾,这并不是它的工作方式。当您像这样复制对象变量时,您所做的只是创建指向同一对象的另一个指针。如果您想要完全分离的对象实例,则可以使用clone,或者您可以使用DateTimeImmutable类。 - iainn
看起来你所做的一切都只是在添加天数吗?所以当你加上2时,日期会变成第10天,然后再加上3就会变成第13天。 - Isaac
1个回答

15

当将$startDt赋值给$date时,其值不是被复制而是被引用。你需要显式地将对象复制到其他变量中:

# referenced
$date = $startDt;

# copied
$date = clone $startDt;

我明白了!谢谢你的帮助,Paul :) - Frenchmassacre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接