Как я могу создать класс PHP, где одна из его функций это клонировать себя? - PullRequest
1 голос
/ 15 декабря 2011

По сути, мне нужно хранить прошлые версии этого объекта в его текущем состоянии в массиве. Что-то вроде:

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

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

Я знаю, что делаю что-то вроде "clone $ this-> n", но как я могу буквально клонировать сам объект MyClass и сохранить его в массив, который содержит объект MyClass?

Спасибо

Ответы [ 3 ]

6 голосов
/ 15 декабря 2011

То, что вы предложили, действительно работает, за исключением того, что у вас был неправильный код.Работает следующая версия:

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;
1 голос
/ 15 декабря 2011

Вы также можете попробовать сериализацию для сложных объектов.Он будет хранить объект в виде строки.В конце концов вы можете отменить сериализацию строки в объект с прошлым состоянием.

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

0 голосов
/ 15 декабря 2011

После небольшой очистки ваш код работает. Тем не менее, вы, вероятно, хотите очистить $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);
...