如何创建一个PHP类,其中一个函数用于克隆自身?

问题描述:

基本上,我需要将当前状态的此对象的过去版本存储在一个数组中。喜欢的东西:如何创建一个PHP类,其中一个函数用于克隆自身?

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

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

我知道我做了什么样的“克隆$这个 - > N”,但我怎么可以从字面上克隆MyClass的对象本身,并将其存储到一个数组的MyClass的对象持有?

感谢

+0

上面的代码有什么问题? – DaOgre 2011-12-14 22:56:44

你实际上提出什么工作,除非你有一些不正确的代码。以下版本的作品:

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

您还可以尝试序列化复杂的对象。它将把对象存储为一个字符串。毕竟,你可以将字符串反序列化为过去状态的对象。

http://php.net/manual/en/language.oop5.serialization.php

随着一点点的清理,你的代码工作。但是,您可能希望在旧版本中清除旧版本的$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);