对象分配与引用

时间:2013-01-28 09:35:41

标签: php oop class object

我在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属性stringNULL已分配给$instance

2 个答案:

答案 0 :(得分:1)

$assigned = $instance是一个参考作业,这是误导性的。您可以更好地将其视为$instance是一个指针:它具有值(非引用)语义,尽管它的许多副本可以指向同一个对象。

另一方面,$reference =& $instance确实创建了一个别名:当检查另一个变量时,其中一个变量发生的任何事件也会立即可见。

答案 1 :(得分:0)

对象引用和变量引用之间存在差异:

对象引用实际上是对象标识符,存储为变量的 value ,对象本身存储在一个单独的表中,与变量无关。