2015-11-04 49 views
0

我有一個循環,我正在存儲一個已更新到數組中的下一個位置的對象。 PHP正在存儲對該對象的引用,而不是將該對象存儲在數組中。所以,在循環結束時,我的數組包含許多對最新版本對象的引用,它們都包含相同的信息。如何在循環的每次迭代中存儲對象的實例?如何在數組中存儲對象,而不是對PHP中的對象的引用?

while($Row = $Query->fetch_object()) { 
    $Company->id = $Row->id; 
    $Company->json = json_decode($Row->json); 
    $companies[] = $Company; 
} 
+0

嘗試使用array_push和after循環返回它嗎? –

+0

'克隆'的作品。爲什麼是這樣?我無法相信我從未遇到過這個問題。當我直接將$ Row從數據庫中存儲到一個數組時,它不存儲對$ Row的引用,它存儲該對象。 WTF? –

+1

你指的是什麼確切的*問題* PHP多年來一直這樣工作,並且有許多關於這種行爲的文章以及它爲什麼在那裏。如果它按照你認爲的方式工作,那麼我們的手中就會缺乏記憶。 –

回答

2

您可以通過既可以創建在每個迭代一個新的對象:

  1. 實例化一個新的對象$newObj = new CompanyClass();
  2. 克隆舊的對象$newObj = clone $Company;

但是要記住的是PHP執行對象所有屬性的淺表副本。任何引用其他變量的屬性都將保留引用。

while($Row = $Query->fetch_object()) { 
    $newCompany = clone $Company; //or new CompanyClass(); 
    $newCompany->id = $Row->id; 
    $newCompany->json = json_decode($Row->json); 
    $companies[] = $newCompany; 
} 
+0

嗯...我想我明白了。所以PHP認識到我的'$ Company'對象在任何地方都是一樣的,除非我實例化它的新副本,在這一點上,PHP知道它是一個不同的對象,即使認爲變量名是相同的?這是一個令人困惑的行爲,我不相信我從來沒有以這種方式遇到過它。 –

+1

這不是一個奇怪的行爲,它在OOP語言中很常見。在PHP中,對象作爲引用傳遞,而基元作爲值傳遞。 – Tivie

+0

非常有意義。謝謝。 –

相關問題