То, что вы предложили, действительно работает, за исключением того, что у вас был неправильный код.Работает следующая версия:
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;