Вообще эта тема возникла из-за следующего бага в 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 объектов получаются именно те цифры, о которых стоит беспокоиться