以前的文章中,咱们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,直接就是引用赋值。那么到底真实状况是怎样呢?php
以前变量赋值的文章git
PHP的变量赋值github
对象引用测试微信
在继续深刻的学习PHP手册后,发现原来对象还真不是直接的引用复制。经过下面手册中的例子来进行分析:数据结构
class SimpleClass {} $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);
是否是很神奇,照理说,普通赋值是拷贝,两个变量不会相互影响。而引用赋值是复制指针(相同的内存地址),修改任意一个变量其余的变量也会改变。可是对象的普通赋值貌似并不属于它们中的任何一个。oop
$reference很好理解,自己使用&符号进行了赋值,代表了这个变量是一个引用赋值。它成为了$instance的快捷方式,$instance的一切变化它都都会跟着改变。这是变量层面的。学习
$assigned从代码字面上看是一个普通赋值。不过对象是一种特殊的形态,它用普通赋值赋过来的值实际上是对象的一个句柄。在PHP手册中有一个Note是如此描述的:测试
首先,将PHP中的变量当作是一个一个的数据槽。这个数据槽能够保存一个基本类型(int、string、bool等)。建立引用时,这个槽里保存的是内存地址,或者说是指向引用对象的一个指针,引用没有拷贝操做,仅仅是将指针指向了原变量(参考数据结构)。建立普通赋值时,则是拷贝的基本类型。this
而对象则与基本类型不一样,它不能直接保存在数据槽中,而是将对象的“句柄”保存在了数据槽。这个句柄是指向对象特定实例的标识符。虽然句柄不是咱们所能直观操做的类型,但它也属于基本类型。.net
当你获取一个包含对象句柄的变量,并将其分配给另外一个变量时,另外一个变量获取的是这个对象的句柄。(注意,不是引用!不是引用!不是引用!!)。经过句柄,两个变量均可以修改同一个对象。可是,这两个变量并无直接关系,它们是两个独立的变量,其中一个变量修改成其余值时,并不会对另外一个变量产生影响。只有该变量在修改对象内部的内容时,另外一个变量由于持有相同的句柄,因此它的对象内容也会相应地发生改变。
Note原文:
https://www.php.net/manual/zh/language.oop5.basic.php#79856
总结
经过本文的分析,咱们能够看出,变量赋值说白了就是变量层面的操做。它保存的永远只是一个值而已。当普通赋值时,这个值就是一个基本类型。当引用赋值时,这个保存的基本类型就是一个指针。无论怎么样,它也不会由于保存的是对象而将普通赋值直接转变为引用赋值,真正的引用赋值是必需要加&符的。
这个内容有点绕,不过这样的内容才能更体现本身的核心能力。读书百遍其义自现,对于手册中的不少知识本人也是来回不断学习才能理解。上面的Note做者写得很是好,英文好的朋友能够直接去看英文原版。
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532