clone doctrine ArrayCollection没有引用

时间:2017-04-07 15:09:26

标签: symfony doctrine arraycollection

当我这样做时

$originalTags = $task->getTags();
$task->removeTag($tag1);

然后在$tag1中删除$originalTags。所以ArrayCollections的赋值是通过引用来完成的,如何将它克隆到一个新的ArrayCollection?

3 个答案:

答案 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;
}