PHP 中的对象复制与克隆

2022-08-30 15:55:34

请考虑以下事项:

$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) { }

它是否是具有与 相同的内容的正常 PHP 行为?$object2$object1

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


答案 1

是的,这很正常。在 PHP5 中,对象总是通过引用“分配”。要实际制作对象的副本,您需要它。clone

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

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


答案 2

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

$object1 = new stdClass();

将新对象实例指派给 。$object1

$object2 = $object1;

将对象实例指派给 。$object2

$object3 = clone $object1;

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

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

克隆允许对象指定其复制方式


推荐