2011-02-10 5 views
1

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

$objClone = clone $objDummy;

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

EDIT: В ответ на Крис. Вот пример

<?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 
+1

Просто немного примечание:) распорки (не требуется для клона, как это не функция, но работает больше как «новый «Оператор – edorian

ответ

8

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

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

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

UPDATE
на основе обновления вашего вопроса, вы на самом деле не хватает реализации __clone(). Поскольку член $myVarmyObject сам по себе является объектом, вам также нужно клонировать его. Вот что ваш 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

снова проверьте вопрос. И дайте мне знать, могу ли я получить решение. – Gaurav

+0

@Gaurav Я обновил свой ответ с помощью кода. –

+0

OMG, это простое решение. Я, должно быть, внимательно прочитал документ. В любом случае спасибо за вашу помощь. – Gaurav

0

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

КОД

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; 

ВЫВОД

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; 

ВЫВОД

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

Я отредактировал мой вопрос. – Gaurav

+0

@ Рич Адамс был прав. Я отредактирую свой ответ, чтобы продемонстрировать. Метод __clone() будет заботиться о вас. :) –

Смежные вопросы