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,你错了。你只是在复制参考资料。参考文献确实是重复的,所以你得到了