【发布时间】:2011-10-21 19:39:54
【问题描述】:
考虑以下几点:
$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) { }
$object2 的内容与$object1 相同是正常的 PHP 行为吗?
在我看来,$object2 是对 $object1 的引用,而不是副本。
在更改内容之前克隆对象确实像副本一样。
这种行为与变量发生的行为不同,对我来说似乎不直观。
【问题讨论】:
-
这只是由于缺少规范而导致的另一个 PHP-WTF。
-
你能详细说明为什么这对你来说不直观吗?
-
这对我来说很不直观,因为逻辑会随着变量的类型而变化。正如以下答案中所解释的,例如,它不会以数组的方式运行。
-
在我看来,它是相当不直观,因为
$obj2 = $obj1和$obj2 =& $obj1做同样的事情。 -
@Antti29 - 他们做的事情并不完全相同。
$obj2 = $obj1导致对同一底层对象的 2 个单独引用。因此,如果您随后执行$obj2 = $obj3,则您的$obj1变量不受影响。但是,如果您从$obj2 =& $obj1开始,您最终会得到 2 个共享相同引用的变量!如果您然后执行$obj2 = $obj3,您会发现$obj1现在也指向$obj3!