我如何创建一个PHP类,其中的一个函数需要克隆自身?
基本上,我需要将这个对象的过去版本以其当前状态存储在一个数组中。比如:我如何创建一个PHP类,其中的一个函数需要克隆自身?,php,clone,this,Php,Clone,This,基本上,我需要将这个对象的过去版本以其当前状态存储在一个数组中。比如: public class MyClass{ $n = 0; $array = array() storeOldVersion(){ $this->array[] = clone $this; } } 我知道我做了类似于“clone$this->n”的事情,但是我如何真正地克隆MyClass对象本身,并将其存储到MyClass对象所持有的数组中呢 谢谢你
public class MyClass{
$n = 0;
$array = array()
storeOldVersion(){
$this->array[] = clone $this;
}
}
我知道我做了类似于“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
你的建议实际上是可行的,只是你有一些不正确的代码。以下版本有效:
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
您还可以尝试对复杂对象进行序列化。它将对象存储为字符串。毕竟,您可以将字符串取消序列化为具有过去状态的对象
您还可以尝试对复杂对象进行序列化。它将对象存储为字符串。毕竟,您可以将字符串取消序列化为具有过去状态的对象
只需稍加清理,代码就能正常工作。但是,您可能希望清除存储在旧版本中的旧版本的
$array
,否则您将面临一个巨大的递归混乱
只要稍微清理一下,您的代码就能正常工作。但是,您可能希望清除存储在旧版本中的旧版本的$array
,否则您将面临一个巨大的递归混乱
你上面的代码怎么了?你上面的代码怎么了?我实际上两个变量都是私有的…这有关系吗?没关系。无论如何,您都应该使用访问器方法。e、 g.$a->getOldVersions();等我将其公开只是为了能够转储它来演示示例。@user954912-否,因为类本身正在访问它们。但是,请注意,将以前的版本存储在类本身中意味着保存它们的数组将与n
一起克隆。当我在“storeOldVersion()”函数中时,是否应该使用访问器方法?或者仅当我使用MyClass对象的实例时?@user954912我建议在类内外使用getter和setter。它使代码更具可读性,并为重构提供了更大的灵活性。实际上,我将这两个变量都作为私有变量…这有关系吗?没关系。无论如何,您都应该使用访问器方法。e、 g.$a->getOldVersions();等我将其公开只是为了能够转储它来演示示例。@user954912-否,因为类本身正在访问它们。但是,请注意,将以前的版本存储在类本身中意味着保存它们的数组将与n
一起克隆。当我在“storeOldVersion()”函数中时,是否应该使用访问器方法?或者仅当我使用MyClass对象的实例时?@user954912我建议在类内外使用getter和setter。它使您的代码更具可读性,并为重构提供了更大的灵活性。如果在序列化之前删除历史记录,我认为最好记住序列化。如果在序列化之前删除历史记录,我认为最好记住序列化。
<?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);