首先,对于这个愚蠢的问题,我很抱歉,但我在php.net上读了一篇文章,我不明白它到底说了什么。
<?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);
?>
输出结果如下:
NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned will have this value"
}
$instance和$reference指向相同的位置,我得到了这一点,并且我理解为什么我们会得到它们的NULL和NULL。
但是$assigned呢?它是不是也指向了存储$instance的地方?为什么当我们使用$instance->var
时,它会影响$assigned,而当我们将$instance设置为null时,$assigned不会发生变化?
我认为所有这三个变量都指向内存中的一个位置,但显然我错了。你能给我解释一下到底发生了什么吗?什么是$assigned?非常感谢!
发布于 2012-10-19 16:10:09
$reference
指向$instance
的值,该值本身是对对象的引用。因此,当您更改$instance
包含的值时,$reference
会反映此更改。
另一方面,$assigned
是$instance
值的副本,并且独立地指向$instance
引用的对象本身。因此,当值$instance
被更新为指向nothing (即null
)时,$assigned
不会受到影响,因为它仍然指向对象,并且不关心$instance
的内容。
发布于 2012-10-19 16:08:16
设置$instance = null;
不会更新$assigned
,因为它不会更新$instance
指向的位置的数据。相反,它正在修改$instance
指针本身,以便指针不再指向与$assigned
相同的数据。
发布于 2012-10-19 16:11:32
一个对象是内存中的一个独立实体,它可以有一个或多个引用。如果它的值为0,就会被垃圾回收。
包含对象的变量实际上指向(引用)该对象。所以当你这样做的时候:
$var1 = new Object();
$var2 = $var1;
您只需创建两个指向同一对象的变量($var2复制$var1的值,但该值是对该对象的引用)。
如果您随后编写$var1 = null
,您将删除该引用,但$var2仍然指向该对象。
&运算符实际上返回对其后面的变量的引用,因此当您编写
$var1 = &var2;
那么$var1不会同时指向$var2所指向的对象,但是$var1会指向$var2本身。因此,当您将$var2设为null时,$var1将指向相同的null。
https://stackoverflow.com/questions/12969941
复制相似问题