2017-04-07 76 views
0

當我做克隆主義的ArrayCollection沒有參考

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

然後$tag1也在$originalTags刪除。所以ArrayCollections的分配是通過引用完成的,我怎樣才能將它克隆到一個新的ArrayCollection?

+0

http://php.net/manual/en/language.oop5.cloning.php – DrKey

+0

$任務是學說的實體嗎? – JackalopeZero

+1

@drkey很酷,很容易,你可以發表這個答案 – Asara

回答

0

您可以簡單地使用本地PHP cloneobject cloning

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

我可能會在解決方案已經發現自己,但我不知道這是否會導致任何問題,因爲我可能會丟失數據:

$originalTags = new ArrayCollection($task->getTags()->toArray()); 
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; 
}