我在PHP Classes and Objects: The Basics上找到了以下示例,但我无法理解背景中发生了什么。
有声明:
将已创建的类实例分配给新变量时,新变量将访问与分配的对象相同的实例。将实例传递给函数时,此行为是相同的。可以通过克隆来创建已创建对象的副本。
我认为这是默认情况下通过引用传递对象的状态,因此如果要创建真实副本,则应该clone
。 ( PHP中既没有浅拷贝。是的,默认情况下有clone
。)
考虑以下示例(从上面的链接复制):
<?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"
}
我不明白。
默认情况下,如果$assigned = $instance;
是对象的引用(别名),那么$assigned
仍然是SimpleClass
的对象,其中包含$var
属性string
,NULL
已分配给$instance
。
答案 0 :(得分:1)
说$assigned = $instance
是一个参考作业,这是误导性的。您可以更好地将其视为$instance
是一个指针:它具有值(非引用)语义,尽管它的许多副本可以指向同一个对象。
另一方面,$reference =& $instance
确实创建了一个别名:当检查另一个变量时,其中一个变量发生的任何事件也会立即可见。
答案 1 :(得分:0)
对象引用和变量引用之间存在差异:
对象引用实际上是对象标识符,存储为变量的 value ,对象本身存储在一个单独的表中,与变量无关。