【问题标题】:The object assignment doesn't make sense in PHP OOP对象分配在 PHP OOP 中没有意义
【发布时间】:2011-11-24 19:50:57
【问题描述】:

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

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

【问题讨论】:

    标签: php oop variable-assignment


    【解决方案1】:

    $b = $a; 中,只有对象引用被复制,而不是对象。

    但是,当您使用clone 时,对象确实被复制了,因此$c = clone $b, 会创建一个新对象(由$c 引用)和一个新引用($c)。

    $b =& $a; 中,两个符号$a$b 将指向同一个引用,也就是说,甚至不会复制引用(因此分配给$b 的,比如说一个整数,也会影响$a的值)。

    总而言之,这里有两种间接方式:从符号到"zval"(在这种情况下是对象引用)和从对象引用到对象本身(即到实际对象所在的内存部分)状态被存储)。

    【讨论】:

      【解决方案2】:

      来自PHP manual

      将已创建的类实例分配给新变量时,新变量将访问与分配的对象相同的实例。将实例传递给函数时,此行为是相同的。可以通过克隆来制作已创建对象的副本。

      【讨论】:

        【解决方案3】:

        PHP 使用对象的引用。所以当你创建一个新的时

        $a = new myClass();
        

        PHP 实际上并没有将它存储在 in $a,它只是将引用放在那里。现在你复制参考:

        $b = $a;
        

        当你修改$a指向的对象时,你也修改了$b指向的对象,因为它们指向的是同一个东西。

        【讨论】:

          【解决方案4】:

          由于$a 表示对对象的引用而不是对象本身,因此您将引用分配给$b。现在,$a$b 引用同一个对象,当您操作 $b 引用的对象时,更改也会反映通过 $a 访问它。

          【讨论】:

            【解决方案5】:

            对象由引用处理,引用在赋值时是别名。所以在你说$b = $a之后,两个变量都指向相同的对象。

            值/引用的区别在许多“现代”面向对象语言中是基本的:值被复制,引用被别名。不幸的是,语言的语法并不总是清楚地表明变量在任何给定点遵循的语义。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-03
              • 2012-10-04
              • 1970-01-01
              • 1970-01-01
              • 2019-01-27
              • 1970-01-01
              • 2015-03-08
              • 1970-01-01
              相关资源
              最近更新 更多