【发布时间】:2017-11-17 05:58:56
【问题描述】:
考虑下面的代码 sn-p :
<?php
class SimpleClass {
// property declaration
public $var = 'a default value';
// method declaration
public function displayVar() {
echo $this->var;
}
}
$instance = new SimpleClass();
$assigned = $instance;
$instance->var = '$assigned will have this value';
var_dump($instance);
echo "<br>";
var_dump($assigned);
?>
以上代码的输出如下:
object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value" }
object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value" }
我对上面的程序很了解。我理解对$instance 或$assigned 的任何更改都会反映在另一个中,因为它们指向同一个对象实例。
但是在将NULL 分配给两个对象实例中的任何一个时,这个原则在下面的代码中失败了。预计两个对象实例都应变为NULL,但两者之一包含NULL,另一个不包含NULL。为什么会这样?
<?php
class SimpleClass {
// property declaration
public $var = 'a default value';
// method declaration
public function displayVar() {
echo $this->var;
}
}
$instance = new SimpleClass();
$assigned = $instance;
$instance = NULL;
var_dump($instance);
echo "<br>";
var_dump($assigned);
?>
以上代码输出如下:
NULL
object(SimpleClass)#1 (1) { ["var"]=> string(15) "a default value" }
此外,在上面的代码中,没有调用类方法 displayVar() 的地方,它与文本 'a default value' 相呼应,也没有任何构造方法存在,那么对象实例 $assigned 的 var 属性是如何获取的设置而不是在其中包含NULL?
由于两个对象实例都指向同一个对象,为什么当NULL被分配给其中一个时它们以一种方式表现,而当字符串或一些有意义的值被分配给其中一个时它们以另一种(预期的)方式表现?
【问题讨论】:
-
通过将对象分配给变量,它只复制该对象的“内存地址”,而不是整个对象及其内容。要复制对象及其内容,您需要使用: $assigned = clone $instance;
标签: php class object reference