4

我在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具有 that 的属性string,而NULL被分配给$instance.

4

2 回答 2

1

说这$assigned = $instance是引用分配是一种误导。你最好把它想象成$instance一个指针:它具有值(不是引用)语义,尽管它的许多副本可以指向同一个对象。

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

于 2013-01-28T09:38:45.533 回答
0

对象引用和变量引用是有区别的:

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

于 2013-01-28T09:44:36.290 回答