【问题标题】:How can I create a PHP class where one of its functions it to clone itself?如何创建一个 PHP 类,其中它的一个功能是克隆自身?
【发布时间】:2012-01-20 17:23:43
【问题描述】:

基本上,我需要将这个对象的过去版本以其当前状态存储在一个数组中。比如:

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

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

我知道我做了类似“clone $this->n”之类的操作,但我如何才能真正克隆 MyClass 对象本身,并将其存储到 MyClass 对象所拥有的数组中?

谢谢

【问题讨论】:

  • 你上面的代码有什么问题?

标签: php clone this


【解决方案1】:

您也可以尝试对复杂对象进行序列化。它将对象存储为字符串。毕竟,您可以将字符串反序列化为具有过去状态的对象。

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

【讨论】:

  • 如果在序列化之前去掉历史,我觉得有序列化的想法就好了。
【解决方案2】:

稍微清理一下,您的代码就可以工作了。但是,您可能希望在存储的旧版本中清除旧版本的 $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);

【讨论】:

    【解决方案3】:

    您提出的建议实际上可行,只是您的代码不正确。以下版本有效:

    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;
    

    【讨论】:

    • 我实际上将两个变量都设为私有...这有关系吗?
    • 没关系。无论如何,您都应该使用访问器方法。例如$a->getOldVersions();等等。我将其公开只是为了说明示例。
    • @user954912 - 不,因为类本身正在访问它们。但是,请注意,将以前的版本存储在类本身意味着保存它们的数组与n 一起被克隆。
    • 当我在“storeOldVersion()”函数中时应该使用访问器方法吗?还是仅当我使用 MyClass 对象的实例时?
    • @user954912 我建议在课堂内外使用 getter 和 setter。它使您的代码更具可读性,并为您提供更大的重构灵活性。
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多