2016-11-29 73 views
3

我有一個對象,做一些事情,並返回像這樣的對象的靜態函數:傳遞對象的功能在PHP

$objectA = ObjectA::getItem(); 

然後我有一個功能,使得其他類型的對象,並返回一個陣列其中,這些類型的對象的一部分,需要$objectA,所以它被傳遞中,像這樣:

$arrayOfObjectB = ObjectB::getStuff($objectA); 

在構建$arrayOfObjectB我改變$objectA的一部分,這將是$objectB的一部分。

事情是這樣的:

public static function getStuff($objectA) 
{ 
    $arrayOfObjectB = array(); 
    foreach(...loops through some stuff) 
     { 

      $objectA->setSomething($variableChangedDuringLoop); 
      $objectB = new ObjectB($objectA); 
      $arrayOfObjectB[] = $objectB; 
     } 
} 

什麼情況是,所有在$arrayOfObjectB$objectA->something將已設定爲同樣的事情,在循環的最後一個項目,我想發生這樣對於$something在循環中保存單獨的值。

我可以在循環過程中每次克隆對象,然後設置它們,這是可行的。 但是這種方法似乎是錯誤的。

回答

1

當您將對$objectA的引用傳遞給函數或構造函數時,不會創建該對象的副本。如果您對$objectA進行了修改,則會影響與該函數(或構造函數)外部存在的對象的相同實例。如果你想要獨立的實例,你需要製作一個對象的副本。類似這樣的:

public static function getStuff($objectA) 
{ 
    $arrayOfObjectB = array(); 
    foreach(...loops through some stuff) 
     { 
      // make a copy of $objectA 
      $objectAClone = new ObjectA(); 
      $objectAClone->setX($objectA->getX()); 
      $objectAClone->setY($objectA->getY()); 
      ... 
      $objectAClone->setSomething($variableChangedDuringLoop); 
      $objectB = new ObjectB($objectAClone); 
      $arrayOfObjectB[] = $objectB; 
     } 
} 
+0

我已經這麼做了,正如我在問題結尾處提到的那樣,可能應該早一點提到這種方式,對此感到抱歉。我的問題基本上是否有比克隆對象更好的方法? – user2209644

+2

沒有。就是這個方法。製作一個克隆。這沒有錯。如果你需要一個完整的數組填充不同狀態的對象,它們不能都是同一個實例。對於大小爲n的數組,您需要n個獨立的實例。沒辦法。如果您希望代碼看起來更清晰一些,則可以將克隆操作提取爲單獨的方法。 – Asaph

+1

好吧,現在有道理,謝謝一堆 – user2209644

0

要做你想做的事,你需要克隆你的對象。如果感覺不對,可能是因爲你試圖做的事情並不是真的正確。

我可以提出一個更好的解決方案,但我需要知道你實際上在用這些值做什麼。