在PHP OOP中,对象分配没有意义

时间:2011-09-25 22:12:55

标签: php oop variable-assignment

我接受了测试,我弄错了,但这没有意义:

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的变量吗?我认为所有对象都是独立的,除非它有&符号(=&)设置的直接参考,否则不会更新?

5 个答案:

答案 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语言的基础:值被复制,引用被别名化。或许不幸的是,语言的语法并不总能明确变量在任何给定点遵循哪种语义。