foreach循环中的PHP变量赋值-未知行为

foreach循环中的PHP变量赋值-未知行为,php,cakephp,foreach,Php,Cakephp,Foreach,这完全把我难住了。我正在使用一个CakePHP3.9.6应用程序和PHP7.4上的tplaner/When库来生成重复事件。在某些地方,开始日期和结束日期被设置为相同的日期。以下是我的EventsController::add方法中的部分: $data=$this->request->getData(); $copies=newwhen(); $copies->freq($data['frequency'])) ->间隔($data['interval'])) ->wkst(“MO”); 如果(

这完全把我难住了。我正在使用一个CakePHP3.9.6应用程序和PHP7.4上的tplaner/When库来生成重复事件。在某些地方,开始日期和结束日期被设置为相同的日期。以下是我的EventsController::add方法中的部分:

$data=$this->request->getData();
$copies=newwhen();
$copies->freq($data['frequency']))
->间隔($data['interval']))
->wkst(“MO”);
如果($data['frequency']=='WEEKLY'){
$copies->byday(内爆(',',$data['days']);
}
如果(!empty($data['count'])){
$copies->count($data['count']);
}否则{
$copies->till(新日期时间($data['last_date'].”23:59:59“);
}
$copies->startDate(新日期时间($event->start->toDateTimeString())->generateOccurrences();
$newCopies=$copies->实例;
$interval=$event->start->diff($event->end);
foreach($newCopies作为$copy){
Log::debug($copy);//显示从开始日期开始计算的系列中的下一个日期
如果($copy==$event->start){
continue;//第一个事件已保存在操作的其余部分中,请不要创建另一个副本
}
$temp=$event->toArray();//将实体详细信息复制到数组
$temp['start']=$copy;//分配新的开始时间
$start=$copy;//认为可能是由于竞争条件?复制到新对象以修改结束时间
$temp['end']=$start->add($interval);/$interval根据原始事件数据计算,添加到新的开始时间
日志::调试($temp);
$result=$this->Events->newEntity($temp);//返回到新实体
日志::调试($result);
$events[]=$result;//添加到saveMany()的实体数组中
}
我遇到的问题是数组/实体中的新开始日期与结束日期相同:

Log::debug($copy)
输出正确的新开始日期


Log::debug($temp)
显示数组,但开始和结束属性是相同的…

您不能执行$start=$copy操作,因为它们将是具有不同引用的相同“对象”,您实际上要克隆$copy,因此它是一个单独的对象。因此,当您更改一个时,您不必触摸另一个

或者,您可以使用
DateTimeImmutable
,然后它就可以按原样工作了。when()类是DateTime派生类吗?是的,它是:
类when extensed DateTime
。另外,谢谢,以前从未使用过
clone
。说得好。它是从可变版本派生的。因此,我先前的评论是无效的。