Клон у меня не работает? - PullRequest
       19

Клон у меня не работает?

2 голосов
/ 10 февраля 2011

У меня есть объект $objDummy некоторого класса ClassDummy, а другой - как

$objClone = clone $objDummy;

Затем я внесу любое изменение в $objClone, $objDummyизменилось.Я не хочу этого делать.Как я могу заставить это работать?

РЕДАКТИРОВАТЬ: В ответ на Крис.Вот пример

<?php
class myAnotherObject{
    public $myAnotherVar =10;
}

class myObject {
    public $myVar = false;
    function __construct() {
        $this->myVar = new myAnotherObject();
    }
}


$nl = "\n";
//*
$nl = '<br />';
//*/


$obj1 = new myObject();
echo 'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar;

$obj2 = clone $obj1;

echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

$obj2->myVar->myAnotherVar = 20;
echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

Вывод

obj1->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 20, obj2->myVar->myAnotherVar: 20

Ответы [ 2 ]

9 голосов
/ 10 февраля 2011

Реализуете ли вы метод __clone()? Примеры в документации PHP о клонировании объяснят это лучше, чем я могу. В частности, вы заинтересованы в этой части,

Когда объект клонируется, PHP 5 будет выполнить мелкую копию всех свойства объекта. Любые свойства это ссылки на другие переменные, останутся ссылками.

После завершения клонирования, если Метод __clone () определен, затем __clone () вновь созданного объекта будет вызван метод, чтобы разрешить любой необходимые свойства, которые должны быть Измененное.

UPDATE
Судя по вашему обновлению вопроса, вам действительно не хватает реализации __clone(). Поскольку $myVar член myObject сам по себе является объектом, вам также необходимо его клонировать. Вот как должен выглядеть ваш myObject класс:

class myObject {
    public $myVar = false;
    function __construct() {
        $this->myVar = new myAnotherObject();
    }

    function __clone() {
        $this->myVar = clone $this->myVar;
    }
}

Выходной результат становится следующим,

obj1->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 20
0 голосов
/ 10 февраля 2011

Я не могу воспроизвести ваши результаты. Используя приведенный ниже код, я получаю ожидаемый результат (скопированный ниже кода). Как показано, метод ___ clone () для этого не требуется. Можете ли вы опубликовать уменьшенную версию своего кода?

CODE

class myObject {
    public $myVar = false;
    function __construct($newVar=5) {
        $this->myVar = $newVar;
    }
}

$nl = "\n";
//*
$nl = '<br />';
//*/


$obj1 = new myObject(10);
echo 'obj1->myVar: '.$obj1->myVar;

$obj2 = clone $obj1;
echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar;

$obj1->myVar = 20;
echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar;

OUTPUT

obj1->myVar: 10
obj1->myVar: 10, obj2->myVar: 10
obj1->myVar: 20, obj2->myVar: 10

Отредактировано после обсуждения:

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

КОД

class myAnotherObject{
    public $myAnotherVar =10;
}

class myObject {
    public $myVar = false;
    function __construct() {
        $this->myVar = new myAnotherObject();
    }
    function __clone() {
        $this->myVar = clone $this->myVar;  
    }
}


$nl = "\n";
//*
$nl = '<br />';
//*/


$obj1 = new myObject();
echo 'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar;

$obj2 = clone $obj1;

echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

$obj2->myVar->myAnotherVar = 20;
echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

OUTPUT

obj1->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 20
...