考虑以下:
$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而不是副本.在更改内容之前克隆对象确实就像一个副本.这种行为与变量发生的情况不同,对我来说似乎不直观.
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核心).那没用.
对象副本与对象克隆
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)
| 归档时间: |
|
| 查看次数: |
36929 次 |
| 最近记录: |