PHP中的对象赋值

PHP中的对象赋值,php,Php,首先,我为这个愚蠢的问题感到抱歉,但我正在读一篇文章,我不明白它到底说了什么 <?php class SimpleClass { // property declaration public $var = 'a default value'; // method declaration public function displayVar() { echo $this->var; } } ?> <?php

首先,我为这个愚蠢的问题感到抱歉,但我正在读一篇文章,我不明白它到底说了什么

<?php
class SimpleClass
{
    // property declaration
    public $var = 'a default value';

    // method declaration
    public function displayVar() {
        echo $this->var;
    }
}
?>



<?php

$instance = new SimpleClass();

$assigned   =  $instance;
$reference  =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
$instance和$reference指向同一个地方,我得到了这一点,我理解为什么我们得到NULL和NULL

但是分配的美元呢?它还指向$instance的存储位置?为什么当我们使用
$instance->var
时,它会影响$assigned,但当我们将$instance设置为null时,$assigned没有变化


我以为这三个变量都指向记忆中的一个地方,但显然我错了。你能给我解释一下到底发生了什么,分配了多少美元吗?多谢各位

设置
$instance=null
不会更新
$assigned
,因为它不会更新
$instance
指向的位置的数据。它改为修改
$instance
指针本身,使指针不再指向与
$assigned
$reference
指向
$instance
相同的数据,该值本身就是对对象的引用。因此,当您更改
$instance
中包含的值时,
$reference
反映了此更改


另一方面,
$assigned
$instance
值的副本,并独立指向
$instance
引用的对象本身。因此,当值
$instance
更新为不指向任何内容(即
null
)时,
$assigned
不会受到影响,因为它仍然指向对象,并且不关心
$instance

的内容,正如您在代码中看到的那样

$instance=null;//$实例和$reference变为空


$instance现在已变为等于null,但在此之前已设置$assigned。所以$assigned没有得到空值$reference收到空值,因为您使用=&引用了它,它保留了$instance的值

对象是内存中的一个单独实体,可以有一个或多个引用。如果它得到0,它将被垃圾收集

包含对象的变量实际上指向(引用)该对象。 所以当你这样做的时候:

$var1 = new Object();
$var2 = $var1;
您只需创建两个变量,指向同一个对象($var2复制$var1的值,但该值是对该对象的引用)

如果然后写入,
$var1=null
,则删除该引用,但$var2仍指向该对象

&运算符实际上返回对其后面的变量的引用,因此当您写入

$var1 = &var2;

那么$var1并不指向$var2指向的对象,而是$var1指向$var2本身。因此,当您将$var2设为null时,$var1指向同一个null。

在下面的一行中,我们保留了一个存储新对象的内存位置,以及一个指向它的指针,标记为
$instance

$instance = new SimpleClass();
$reference =& $instance;

在下面的一行中,我们创建了对指针
$instance
的引用,标记为
$reference

$instance = new SimpleClass();
$reference =& $instance;

在下一行中,我们保留了一个新的内存位置,标记为
$assigned
,与上面的位置不同且独立,其中存储了上面创建的指针(而不是对象本身)的副本:

$assigned = $instance;
通过将
$instance
设置为
null
,您将只取消设置指向包含实际对象的内存位置的指针,而不是对象本身。对它的任何其他引用(例如,
$reference
)也将被取消设置

$assigned
是指针的独立副本(保存在另一个内存位置),它仍然指向实际对象

这就是为什么它仍然可以用来指代实际对象的原因

PHP文档中的这条评论支持上述内容:

<?php
class A {
    public $foo = 1;
}  

$a = new A;
$b = $a;
$a->foo = 2;
$a = NULL;
echo $b->foo."\n"; // 2

$c = new A;
$d = &$c;
$c->foo = 2;
$c = NULL;
echo $d->foo."\n"; // Notice:  Trying to get property of non-object...
?>

注意

在谈到内存管理时,这代表了一种例外情况。然而,复制变量或数组只是通过使用
=
操作符来实现的,对于对象,您应明确使用
克隆
关键字,如PHP文档中所述:

PHP中通常的按值赋值行为的一个例外 与对象一起发生,这些对象在PHP5中通过引用指定。物体 可以通过克隆关键字显式复制


简短回答,当您使用
创建引用时,会发生以下情况:

$A  ===+
       |===> [symbol table entry x] ====> (memory location)
$B  ===+
在此之后执行正常作业时:

$A  ===+
       |===> [symbol table entry x] ===> (memory location)
$B  ===+                                    ^
                                            |
$C  =======> [symbol table entry y] ========+

让我们逐步了解代码:

$instance = new SimpleClass();

$assigned   =  $instance;
断言:

$assigned === $instance
$assigned === $instance === $reference
$assigned === $instance === $reference
$assigned
$instance
都引用了
SimpleClass
的相同实例

$reference  =& $instance;
断言:

$assigned === $instance
$assigned === $instance === $reference
$assigned === $instance === $reference
所有变量都引用同一实例

$instance->var = '$assigned will have this value';
断言:

$assigned === $instance
$assigned === $instance === $reference
$assigned === $instance === $reference
即使更改了
$instance
的属性,也不会影响引用

$instance = null; // $instance and $reference become null
由于
$reference
只是符号表中的一个别名,因此它获得的值与
$instance
相同;原始实例(即内存位置)的引用计数减少到1,即
$assigned
变量。

非常简单:

$a = 3;
$b = $a;
$c = &$a;
$a = 0;

var_dump($a);
var_dump($b);
var_dump($c);
输出将是:

int(0)
int(3)
int(0)

因此,它不仅是对象赋值,而且是普通赋值。

您有SimpleClass?类的代码,在大多数情况下都是引用。不过PHP中似乎没有struct。@AlvinWong,IIRC以前不是这样的PHP5@BorisGuéry我对PHPI一无所知不要认为这是一个愚蠢的问题:)如果用任何值替换null,输出仍然是一样的如果我们将一个对象分配给另一个对象,两个对象都将指向相同的位置,直到一个对象的值被更改,对吗?如果我们将null替换为任何其他值,输出将是相同的,如果$var1=$var和$var被更改,$var1也应该更改,因为两者都指向同一个值,以防我们使用某个值而不是null。@Dev,你错了。你只是在复制参考资料。参考文献确实是重复的,所以你得到了