PHP - 为什么用我克隆的对象日期时间属性更新对象日期时间属性?

PHP - Why object datetime attribut is updated with my cloned object datetime attribut?

在我的项目中,我有一个对象 Absence,它有很多属性,包括“dateDebut”属性。

在一个函数中,我处理这个对象来获取一些信息。在这个函数中,我碰巧必须像这样向日期时间添加一天

$processAbsence->setDateDebut($processAbsence->getDateDebut()->modify('+1 day'));

我的目标显然不是修改初始对象。这就是我之前克隆对象的原因:

    public function getNotWorkingDays(Absence $absence)
    {
        //$absence is my original object. I clone it to not apply some modifications on it.
        $processAbsence = (clone $absence)

        while($this->canAbsenceProgress($processAbsence))
        {
           $processAbsence = $this->doAbsenceProgress($processAbsence);
        }

      //...
   }

       private function doAbsenceProgress(Absence $absence)
    {
        // Here too, I cloned the previous cloned object, I make some modifications on it and return it
        $processAbsence = (clone $absence);

        if ('matin' == $processAbsence->getMomentDebut()) {
            $processAbsence->setMomentDebut('après-midi');
        } else {
            $processAbsence->setDateDebut($processAbsence->getDateDebut()->modify('+1 day'));
            $processAbsence->setMomentDebut('matin');
        }

        return $processAbsence;
    }

但是当我转储我的 $absence 对象时,我可以看到 $absence->getDateDebut() 已经被更改,就像克隆的对象应该是 ...

我不明白为什么

From the docs

When an object is cloned, PHP will perform a shallow copy of all of the object's properties. Any properties that are references to other variables will remain references.

如文档中所示,您可能需要为您的 Absence class 提供一个 __clone 方法,您需要在其中显式克隆引用日期时间的属性对象,因此您最终也会得到这些对象的克隆,而不是指向相同对象的指针:

class Absence 
{
    public $dateDebut;

    function __clone()
    {
        // Force a copy of this->dateDebut, otherwise
        // it will point to same object.
        $this->dateDebut= clone $this->dateDebut;
    }
}