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()
已经被更改,就像克隆的对象应该是 ...
我不明白为什么
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;
}
}
在我的项目中,我有一个对象 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()
已经被更改,就像克隆的对象应该是 ...
我不明白为什么
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;
}
}