我接受了测试,我弄错了,但这没有意义:
class myClass
{
public $x;
function myMethod()
{
echo $this->x;
}
}
$a = new myClass();
$a->x = 10;
$b = $a;
$b->x = 20;
$c = clone $b;
$c->x = 30;
$a->myMethod();
$b->myMethod();
$c->myMethod();
我的直觉将是102030,但结果实际上是202030! 10发生什么事了?!?!不应该单独留下$ a的变量吗?我认为所有对象都是独立的,除非它有&符号(=&)设置的直接参考,否则不会更新?
答案 0 :(得分:1)
在$b = $a;
中,仅复制对象引用,而不是对象。
但是,当您使用clone
时,该对象确实被复制,因此$c = clone $b,
创建一个新对象(由$c
引用)和一个新引用({{1} })。
在$c
中,符号$b =& $a;
和$a
都会指向相同的引用,即甚至不会复制引用(因此对{{1}的赋值例如,一个整数,也会影响$b
)的值。
总而言之,这里有两个间接:从符号到"zval"(在对象引用的情况下)和从对象引用到对象本身(即,到内存的一部分)存储实际对象状态。
答案 1 :(得分:1)
来自PHP manual:
将已创建的类实例分配给新变量时,新变量将访问与分配的对象相同的实例。将实例传递给函数时,此行为是相同的。可以通过克隆来创建已创建对象的副本。
答案 2 :(得分:1)
PHP使用对象的引用。所以当你创建一个新的
$a = new myClass();
PHP实际上并没有将它存储在 $a
中,它只是将引用放在那里。现在复制引用:
$b = $a;
修改$a
指向的对象时,还要修改$b
指向的对象,因为它们指向相同的东西。
答案 3 :(得分:0)
由于$a
表示对象的引用而不是对象本身,因此您将引用分配给$b
。现在,$a
和$b
引用同一个对象,当您操纵$b
引用的对象时,更改会反映出来,并通过$a
访问它。
答案 4 :(得分:0)
对象通过引用处理,引用是别名。所以在你说$b = $a
之后,两个变量都引用了相同的对象。
值/引用区别是许多“现代”OO语言的基础:值被复制,引用被别名化。或许不幸的是,语言的语法并不总能明确变量在任何给定点遵循哪种语义。