当我这样做时
$originalTags = $task->getTags();
$task->removeTag($tag1);
然后在$tag1
中删除$originalTags
。所以ArrayCollections的赋值是通过引用来完成的,如何将它克隆到一个新的ArrayCollection?
答案 0 :(得分:3)
您可以使用原生PHP clone
作为object cloning。
$originalTags = $task->getTags();
$task2 = clone $task;
$task2->removeTag($tag1);
答案 1 :(得分:0)
我可能自己找到了解决方案,但我不知道这是否会导致任何问题,因为我可能会丢失数据:
$originalTags = new ArrayCollection( $task->getTags()->toArray() );
答案 2 :(得分:0)
不是每次需要getTags()时单独处理此问题,而是从getTags而不是引用返回一个克隆。
public function getTags(){
return new ArrayCollection($this->tags->toArray());
}
或者如果您需要保留通过引用传递的getTags的功能,请创建一个新函数getClonedTags或将一个变量传递给get函数,该函数将选择性地返回克隆标记。
public function getTags($cloned = false){
if($cloned){
return new ArrayCollection($this->tags->toArray());
}
return clone $this->tags;
}