您现在的位置是:群英 > 开发技术 > PHP语言
PHP的弱引用是什么?怎样实现?
Admin发表于 2021-11-01 17:56:43902 次浏览

    这篇文章给大家分享的是PHP的弱引用的相关内容,一些朋友可能对于弱引用是什么不是很了解,对此本文就给大家讲讲是什么弱引用,文中示例代码介绍的非常详细,感兴趣的朋友接下来跟随小编一起学习一下吧。

    之前的文章中,我们已经学习过引用和引用传值相关的知识。我们知道,PHP 中没有纯引用(指针),不管是对象,还是用引用符号 & 赋值的变量,都是对一个符号表的引用。而今天,我们要学习的是另一种引用形式:弱引用。

    什么是弱引用

    弱引用允许程序员保留对对象的引用,而该对象不会阻止对象被销毁;它们对于实现类似缓存的结构非常有用。

    这是比较官方的解释。从这个说明中,我们可以看出,弱引用也是一种引用形式,但是,如果我们销毁了原来的对象,那么弱引用对象也会被销毁,就像普通的值对象赋值一样。如果没有看过之前的文章,或者对 PHP 中的引用不太熟悉的朋友可能需要再了解一下 PHP 中引用相关的知识。下面,我们直接通过示例来看一下。

    WeakReference

$obj = new stdClass;
$weakref = $obj;

var_dump($weakref);
// object(stdClass)#1 (0) {
// }

unset($obj);
var_dump($weakref);
// object(stdClass)#1 (0) {
// }

$obj1 = new stdClass;
$weakref = WeakReference::create($obj1);

var_dump($weakref->get());
// object(stdClass)#2 (0) {
// }

unset($obj1);
var_dump($weakref->get());
// NULL

$weakref = WeakReference::create(new stdClass);
var_dump($weakref->get());
// NULL

    第一个对象 \$obj 我们进行直接的赋值引用,也就是 PHP 默认的对象赋值。这时候,$weakref 保存的是对象符号表的引用。当我们 unset() 掉 $obj 时,$weakref 依然能够正常使用。也就是说,$weakref 对 $obj 原始对象的内存引用依然保持着。不管我们怎么 unset() 原始的 $obj ,都只是切断了 $obj 的引用符号表,对真正的对象没有影响,垃圾回收器也不会彻底的回收最最原始的 $obj 对象内容。

    第二个对象我们使用的是 WeakReference 的 create() 方法来创建的弱引用,当我们销毁 $obj1 后,$weakref 也会变成 NULL 。这就是弱引用的作用!

    它可以让垃圾回收器正常的回收,它可以避免循环引用带来的内存泄漏问题,它能让引用表现为类似于 C 中的指针操作一样。

    最后一段代码是我们通过 WeakReference::create() 中直接使用 new 来创建对象。这种形式是不行的,会一直返回 NULL 。因为弱引用是通过变量来创建的,它指向的是原始对象的符号表,而变量和对象之间的符号表连接才是弱引用关心的内容,它会根据符号表的状态来判断当前的状态。如果原始对象变量切断了与符号表的连接,那么弱引用的变量也会同步切断,这样,垃圾回收器就能正常的清理这个已经没有任何引用计数的对象了。

    注意

    这里需要注意的是,上面的测试代码必须在 PHP7.4 及以上版本才有用,WeakReference 类是 PHP7.4 新增加的内容。之前的版本需要安装 WeakRef 这个扩展才能实现弱引用的能力,具体的内容可以查阅下方链接中的相关的文档。

    以上就是关于PHP的弱引用的介绍,本文对大家学习PHP的弱引用有一定的帮助,需要的朋友可以了解看看。最后想要了解更多可以继续浏览群英网络其他相关的文章。

文本转载自脚本之家

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: php的弱引用
相关信息推荐
2022-07-26 17:52:33 
摘要:英语不好,并不会影响PHP的学习,因为PHP常用英文也就那么几个。在之前的文章《HTML英文单词汇总(PHP新手收藏)》中介绍了学PHP涉及的所有HTML英文单词,下面先给大家分享一下学PHP涉及的所有CSS英文单词。
2022-04-29 11:58:12 
摘要:给大家带来一篇关于python顺序搜索的两种形式的相关教程文章,内容涉及到Python、python教程等相关内容,更多关于python的内容希望能够帮助到大家。
2022-11-02 18:18:38 
摘要:c语言中continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定。需要注意的是continue语句只结束本次循环,而不是终止整个循环。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部