Я не могу воспроизвести ваши результаты. Используя приведенный ниже код, я получаю ожидаемый результат (скопированный ниже кода). Как показано, метод ___ 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