клонирование объектов

pachanga

Новичок
клонирование объектов

Народ никто не встречался с проблемой клонирования объектов в php?
Т.е. есть один объект надо получить его копию, чтобы дальнейшие изменения копии не влияли на оригинал...
 

KR

alive in new life
вообще-то в ПХП это можно сделать через обычное присваивание

$obj1 = new obj();
$obj2 = $obj1;
 

young

Новичок
проблемой клонирования объектов в php?
В ZE 1.0 Это происходит при обыкновенной присваивании.
$a = $b // Клонировали
$a =& $b // Тот же объект

В ZE 2.0 для этого есть специальный метод __clone
 

netdog

net @
если на то прошло дык можно же и просто ... :)
$obj1 = new obj();
$obj2 = new obj();
ну я думаю это не то что ему надо было как и в случае с $obj2=$obj1;

всё зависит конечно от поставленной задачи, которая сдесь не совсем четкая
 

tony2001

TeaM PHPClub
>serialize + unserialaze подходит, но это медленная процедура....
откуда такая информация?
 

young

Новичок
Объясните, кого чем в данной задаче не устраивает обыкновенное присваивание?
 

AnToXa

prodigy-одаренный ребенок
2 tony2001
хех, тони :)
ты тоже, я смотрю, оба города оставил :)

serialize ведь действительно чуть медленнее, чем простая копия, ибо формирование строки с кучей копирований данных, а потом обратный разбор, хотя это, конечно, не те цифры о которых стоит беспокоиться :)

но читабельность кода явно страдает.
 

pachanga

Новичок
Вообще эта тема возникла из-за следующего бага в php4.2.3(интересно, это баг?):

Имеем следующий код:
PHP:
<?php
	class Obj{
		var $prop;
		
		function Obj(){
			$this->prop = 'A';
		}

		function get_prop(){
			return $this->prop;
		}
	}
	
	class Test{
		var $obj;
		
		function Test(){
			$this->obj = new Obj;
		}				
		
		function test1(){
			$test = $this->obj->get_prop();
		}
		
		function test2(){
			$test = $this->obj->prop;
		}
	}

	$a = new Test;
	
	$a->test1();
	
	$b = $a;
	$b->obj->prop = 'B';
	
	echo '<b>test1</b><br><pre>';
	
	var_dump($a);
	var_dump($b);
	
	echo '</pre>';

	$a1 = new Test;
	
	$a1->test2();
	
	$b1 = $a1;
	$b1->obj->prop = 'B';
	
	echo '<b>test2</b><br><pre>';
	
	var_dump($a1);
	var_dump($b1);
	
	echo '</pre>';
	
?>
С моей версией PHP результат выполнения этого кода такой:

test1

object(test)(1) {
["obj"]=>
&object(obj)(1) {
["prop"]=>
string(1) "B"
}
}
object(test)(1) {
["obj"]=>
&object(obj)(1) {
["prop"]=>
string(1) "B"
}
}

test2

object(test)(1) {
["obj"]=>
object(obj)(1) {
["prop"]=>
string(1) "A"
}
}
object(test)(1) {
["obj"]=>
object(obj)(1) {
["prop"]=>
string(1) "B"
}
}


Обратите внимание на функции Obj :: test1 и Obj :: test2, по сути они идентичные, только Obj :: test1 с точки зрения ООП дизайна правильнее. Однако эта самая правильность мне стоила кучи нервов... Если вызывается Obj :: test1, то все последующие попытки клонировать объект тщетны! У меня ВСЕГДА передается ссылка вместо копии.

Именно из-за этого я усомнился в правильном клонировании объектов в PHP...

P.S.
serialize, unserialize гораздо медленнее обычного =, и если возникает необходимость клонировать более 100 объектов получаются именно те цифры, о которых стоит беспокоиться
 

rihad

Guest
То же самое происходит, если заменить test1 на
PHP:
        function test1(){ 
            $obj = &$this->obj;
            $test = $obj->get_prop(); 
        }
Но если убрать &, то все нормально.
 

pachanga

Новичок
Кстати, это ТАКОЙ подводный камень! Думаю и правда стоит запостить в bugs.php.net...
 
Сверху