对象赋值在PHP中到底是不是引用?
之前的文章中,我们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,直接就是引用赋值。那么到底真实情况是怎样呢?
之前变量赋值的文章
对象引用测试
在继续深入的学习PHP手册后,发现原来对象还真不是直接的引用复制。通过下面手册中的例子来进行分析:
1class SimpleClass
2{}
3
4$instance = new SimpleClass();
5
6$assigned = $instance;
7$reference = &$instance;
8
9$instance->var = '$assigned will have this value';
10
11$instance = null; // $instance and $reference become null
12
13var_dump($instance);
14var_dump($reference);
15var_dump($assigned);
$instance是实例化后的SimpleClass对象
$assigned直接赋值
$reference引用赋值
首先,我们给$instance对象定义了一个变量var
然后将$instance赋值为null
对于引用来说,$reference变量自然也为成了null
但是$assigned并没有变成null,它依然是SimpleClass的实例对象,并且,划重点哦:它有了var属性
是不是很神奇,照理说,普通赋值是拷贝,两个变量不会相互影响。而引用赋值是复制指针(相同的内存地址),修改任意一个变量其他的变量也会改变。但是对象的普通赋值貌似并不属于它们中的任何一个。
$reference很好理解,本身使用&符号进行了赋值,表明了这个变量是一个引用赋值。它成为了$instance的快捷方式,$instance的一切变化它都都会跟着改变。这是变量层面的。
$assigned从代码字面上看是一个普通赋值。不过对象是一种特殊的形态,它用普通赋值赋过来的值其实是对象的一个句柄。在PHP手册中有一个Note是如此描述的:
Note原文:
www.php.net/manual/zh/l…
总结
通过本文的分析,我们可以看出,变量赋值说白了就是变量层面的操作。它保存的永远只是一个值而已。当普通赋值时,这个值就是一个基本类型。当引用赋值时,这个保存的基本类型就是一个指针。不管怎么样,它也不会因为保存的是对象而将普通赋值直接转变为引用赋值,真正的引用赋值是必须要加&符的。
这个内容有点绕,不过这样的内容才能更体现自己的核心能力。读书百遍其义自现,对于手册中的很多知识本人也是来回不断学习才能理解。上面的Note作者写得非常好,英文好的朋友可以直接去看英文原版。