PHP中的对象复制与克隆

dda*_*eno 27 php clone object

考虑以下:

$object1 = new stdClass();
$object2 = $object1;
$object3 = clone $object1;

$object1->content = 'Ciao';

var_dump($object1);
 // Outputs object(stdClass)#1 (1) { ["content"]=> string(4) "Ciao" }
var_dump($object2);
 // Outputs object(stdClass)#1 (1) { ["content"]=> string(4) "Ciao" }
var_dump($object3);
 // Outputs object(stdClass)#2 (0) { }
Run Code Online (Sandbox Code Playgroud)

这是一个正常的PHP行为,$object2其内容是否相同$object1

对我来说,这听起来像是$object2一个参考$object1而不是副本.在更改内容之前克隆对象确实就像一个副本.这种行为与变量发生的情况不同,对我来说似乎不直观.

dec*_*eze 39

是的,这是正常的.在PHP5中,对象始终通过引用"分配".要实际制作对象的副本,您需要clone它.

为了更正确,让我引用手册:

从PHP5开始,对象变量不再包含对象本身作为值.它只包含一个对象标识符,允许对象访问者查找实际对象.当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,该副本指向同一个对象.


hak*_*kre 13

这是正常的,我不会认为这不直观(对象实例):

$object1 = new stdClass();
Run Code Online (Sandbox Code Playgroud)

为其分配新的对象实例$object1.

$object2 = $object1;
Run Code Online (Sandbox Code Playgroud)

将对象实例分配给$object2.

$object3 = clone $object1;
Run Code Online (Sandbox Code Playgroud)

将从现有对象实例克隆的新对象实例分配给$object3.

如果不是这样,每次需要传递具体对象实例时,都需要通过引用传递它.至少这是繁琐的,但PHP在版本4中做了这样的事情(比较zend.ze1_compatibility_mode核心).那没用.

克隆允许对象指定如何复制它.


Pan*_*ajR 9

对象副本与对象克隆

class test{
public $name;
public $addr;
}
// i create a object $ob
$ob=new test();

// object copy 

$ob2=$ob;

// in object copy both object will represent same memory address 
// example 
$ob->name='pankaj raghuwanshi';

// i am printing second object
echo $ob2->name;
// output is : pankaj raghuwanshi

// another example 

$ob2->name='raghuwanshi pankaj';
echo $ob->name;
// output is :  raghuwanshi pankaj

// it means in copy of object original and copy object share same memory place
Run Code Online (Sandbox Code Playgroud)

现在克隆一个对象

$ob1=clone $ob;

echo $ob1->name;  // output is :  raghuwanshi pankaj
echo $ob->name;   // output is :  raghuwanshi pankaj

 $ob1->name='PHP Clone';
 $ob->name='PHP Obj';

echo $ob1->name;  // output is :  PHP Clone
echo $ob->name;   // output is :  PHP Obj

// on the base of these output we can say both object have their own memory space 
// both are independent 
Run Code Online (Sandbox Code Playgroud)