如何创建一个PHP类,其中一个函数用于克隆自身?
基本上,我需要将当前状态的此对象的过去版本存储在一个数组中。喜欢的东西:如何创建一个PHP类,其中一个函数用于克隆自身?
public class MyClass{
$n = 0;
$array = array()
storeOldVersion(){
$this->array[] = clone $this;
}
}
我知道我做了什么样的“克隆$这个 - > N”,但我怎么可以从字面上克隆MyClass的对象本身,并将其存储到一个数组的MyClass的对象持有?
感谢
你实际上提出什么工作,除非你有一些不正确的代码。以下版本的作品:
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;
我实际上有两个变量作为私人......这很重要吗? – user954912 2011-12-14 22:59:01
没关系。无论如何,你应该使用访问器方法。例如$ A-> getOldVersions();等等。我只公开它,以便我可以倾倒它来举例说明。 – SuitedSloth 2011-12-14 23:01:29
您还可以尝试序列化复杂的对象。它将把对象存储为一个字符串。毕竟,你可以将字符串反序列化为过去状态的对象。
随着一点点的清理,你的代码工作。但是,您可能希望在旧版本中清除旧版本的$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);
上面的代码有什么问题? – DaOgre 2011-12-14 22:56:44