2011-12-14 68 views
1

基本上,我需要將當前狀態的此對象的過去版本存儲在一個數組中。喜歡的東西:如何創建一個PHP類,其中一個函數用於克隆自身?

public class MyClass{ 
    $n = 0; 
    $array = array() 

    storeOldVersion(){ 
      $this->array[] = clone $this; 
    } 
} 

我知道我做了什麼樣的「克隆$這個 - > N」,但我怎麼可以從字面上克隆MyClass的對象本身,並將其存儲到一個數組的MyClass的對象持有?

感謝

+0

上面的代碼有什麼問題? – DaOgre 2011-12-14 22:56:44

回答

6

你實際上提出什麼工作,除非你有一些不正確的代碼。以下版本的作品:

class MyClass{ 
    protected $n = 0; 
    public $array = array(); 

    public function storeOldVersion(){ 
      $this->array[] = clone $this; 
      $this->n = 2; 
    } 
} 

$a = new MyClass(); 
$a->storeOldVersion(); 

echo "<pre>"; 
var_dump($a); // retuns class with n = 2 
var_dump($a->array); // return array with one class having n = 0 

警告雖然

如果調用storeOldVersion()一次以上,因爲,它會遞歸地克隆了一個包含其他克隆和「陣列」的字你對象可能呈指數級大幅增長。在將其存儲在陣列中之前,您應該從克隆中取消設置陣列變量。

例如,

$clone = clone $this; 
$clone->array = array(); 
$this->array[] = $clone; 
+0

我實際上有兩個變量作爲私人......這很重要嗎? – user954912 2011-12-14 22:59:01

+0

沒關係。無論如何,你應該使用訪問器方法。例如$ A-> getOldVersions();等等。我只公開它,以便我可以傾倒它來舉例說明。 – SuitedSloth 2011-12-14 23:01:29

0

隨着一點點的清理,你的代碼工作。但是,您可能希望在舊版本中清除舊版本的$array,否則最終會在您的手中產生巨大的遞歸混亂。

<?php 
class MyClass{ 
    private $n = 0; 
    private $array = array(); 

    public function storeOldVersion(){ 
      $clone = clone $this; 
      $clone->array = null; 
      $this->array[] = $clone; 
    } 
} 


$c = new MyClass(); 
$c->storeOldVersion(); 
var_dump($c);