我如何创建一个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);