• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

对象赋值在PHP中到底是不是引用

php 搞代码 4年前 (2022-02-28) 22次浏览 已收录 0个评论

之前的文章中,咱们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,间接就是援用赋值。那么到底真实情况是怎么呢?

之前变量赋值的文章

PHP的变量赋值

对象援用测试

在持续深刻的学习PHP手册后,发现原来对象还真不是间接的援用复制。通过上面手册中的例子来进行剖析:

<code class="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);
  • $instance是实例化后的SimpleClass对象
  • $assigned间接赋值
  • $reference援用赋值
  • 首先,咱们给$instance对象定义了一个变量var
  • 而后将$instance赋值为null
  • 对于援用来说,$reference变量天然也为成了null
  • 然而$assigned并没有变成null,它仍然是SimpleClass的实例对象,并且,划重点哦:它有了var属性

是不是很神奇,照理说,一般赋值是拷贝,两个变量不会相互影响。而援用赋值是复制指针(雷同的内存地址),批改任意一个变量其余的变量也会扭转。然而对象的一般赋值貌似并不属于它们中的任何一个。

$reference很好了解,自身应用&符号进行了赋值,表明了这个变量是一个援用赋值。它成为了$instance的快捷方式,$instance的所有变动它都都会跟着扭转。这是变量层面的。

$assigned从代码字面上看是一个一般赋值。不过对象是一种非凡的状态,它用一般赋值赋过去的值其实是对象的一个句柄。在PHP手册中有一个Note是如此形容的:

首先,将PHP中的变量看成是一个一个的数据槽。这个数据槽能够保留一个根本类型(int、string、bool等)。创立援用时,这个槽里保留的是内存地址,或者说是指向援用对象的一个指针,援用没有拷贝操作,仅仅是将指针指向了原变量(参考数据结构)。创立一般赋值时,则是拷贝的根本类型。

而对象则与根本类型不同,它不能间接保留在数据槽中,而是将对象的“句柄”保留在了数据槽。这个句柄是指向对象特定实例的标识符。尽管句柄不是咱们所能直观操作的类型,但它也属于根本类型。

当你获取一个蕴含对象句柄的变量,并将其调配给另一个变量时,另一个变量获取的是这个对象的句柄。(留神,不是援用!不是援用!不是援用!!)。通过句柄,两个变量都能够批改同一个对象。然而,这两个变量并没有间接关系,它们是两个独立的变量,其中一个变量批改为其余值时,并不会对另一个变量产生影响。只有该变量在批改对象外部的内容时,另一个变量因为持有雷同的句柄,所以它的对象内容也会相应地产生扭转。

Note原文:
https://www.php.net/manual/zh/language.oop5.basic.php#79856

总结

通过本文的剖析,咱们能够看出,变量赋值说白了就是变量层面的操作。它保留的永远只是一个值而已。当一般赋值时,这个值就是一个根本类型。当援用赋值时,这个保留的根本类型就是一个指针。不论怎么样,它也不会因为保留的是对象而将一般赋值间接转变为援用赋值,真正的援用赋值是必须要加&符的。

这个内容有点绕,不过这样的内容能力更体现本人的外围能力。读书百遍其义自现,对于手册中的很多常识自己也是来回一直学习能力了解。下面的Note作者写得十分好,英文好的敌人能够间接去看英文原版。

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E5%AF%B9%E8%B1%A1%E8%B5%8B%E5%80%BC%E5%9C%A8PHP%E4%B8%AD%E5%88%B0%E5%BA%95%E6%98%AF%E4%B8%8D%E6%98%AF%E5%BC%95%E7%94%A8%EF%BC%9F.php

参考文档:

https://www.php.net/manual/zh/language.oop5.basic.php

各自媒体平台均可搜寻【硬核项目经理】


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:对象赋值在PHP中到底是不是引用

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址