【问题标题】:PHP - Why object datetime attribut is updated with my cloned object datetime attribut?PHP - 为什么用我克隆的对象日期时间属性更新对象日期时间属性?
【发布时间】:2021-01-30 02:11:10
【问题描述】:

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

在一个函数中,我处理这个对象以获取一些信息。在这个函数中,我碰巧必须像这样在 dateTime 中添加一天

$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() 已更改,就像克隆的对象应该是...

我不明白为什么

【问题讨论】:

    标签: php datetime clone


    【解决方案1】:

    From the docs

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

    如文档中所示,您可能需要在其中为 Absence 类提供一个 __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;
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 2016-08-05
      • 2014-08-06
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多