PHP 弱引用的相关总结

目录
  • 什么是弱引用
  • WeakReference
  • 注意
  • 测试代码:

之前的文章中,我们已经学习过引用和引用传值相关的知识。我们知道,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 这个扩展才能实现弱引用的能力,具体的内容可以查阅下方链接中的相关的文档。

测试代码:

https://github.com/zhangyue0503...

以上就是PHP 弱引用的相关总结的详细内容,更多关于PHP 弱引用的资料请关注我们其它相关文章!

(0)

相关推荐

  • php传值和传引用的区别点总结

    php传值:在函数范围内,改变变量值得大小,都不会影响到函数外边的变量值. PHP传引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址. 传值:和copy是一样的.[打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立.] <?php $testa=1; //定义变量a $testb=2; //定义变量b $testb = $testa; //变量a赋值给变量

  • PHP中引用类型和值类型功能与用法示例

    本文实例讲述了PHP中引用类型和值类型功能与用法.分享给大家供大家参考,具体如下: PHP中的四种简单类型和复杂类型array都是值类型.同类型间赋值传递的是值,即创建一个副本给新变量. 例如: $int1 = 123; $int2 = $int1;//直接传递的是值,只是做了一个叫int1的副本叫int2 $int2 = 456; echo $int1;//输出 123 echo $int1 === $int2;//为假 $int1 = 123; $int2 = &$int1;//取地址符,传

  • php 多个变量指向同一个引用($b = &$a)用法分析

    本文实例讲述了php 多个变量指向同一个引用($b = &$a)用法.分享给大家供大家参考,具体如下: 引用是什么? 引用就是多个变量指向同一个内存区域地址.如我们经常用的实例一个类,就是内存中开辟了一个区域存储实例的类,实例赋值给变量就是让这个变量指向这个内存区域. 多个变量指向同一个引用有什么好处? 节约了内存空间,多个变量指向同一个内存地址,在调用的时候多个变量都是指向的同一个内存地址. 多个变量指向同一个引用的缺点 要注意使用安全,即是由于多个变量都是指向的同一个内存地址,其中一个变量更

  • PHP实现无限极分类的两种方式示例【递归和引用方式】

    本文实例讲述了PHP实现无限极分类的两种方式.分享给大家供大家参考,具体如下: 面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' =>

  • 详解PHP的引用计数

    什么是引用计数 在PHP的数据结构中,引用计数就是指每一个变量,除了保存了它们的类型和值之外,还额外保存了两个内容,一个是当前这个变量是否被引用,另一个是引用的次数.为什么要多保存这样两个内容呢?当然是为了垃圾回收(GC).也就是说,当引用次数为0的时候,这个变量就没有再被使用了,就可以通过 GC 来进行回收,释放占用的内存资源.任何程序都不能无限制的一直占用着内存资源,过大的内存占用往往会带来一个严重的问题,那就是内存泄露,而 GC 就是PHP底层自动帮我们完成了内存的销毁,而不用像 C 一样

  • php引用和拷贝的区别知识点总结

    对于值传递和引用传递,书本上的解释比较繁琐,而php面试中总会出现,下面我会通过一个生活的例子带大家理解它们之间区别. 第一步 假设我们去酒店订房间,我们把酒店的门牌号比作变量名,我们把房间里住人数当做给这个变量名赋值的过程 <?php $k1=2;//$k1号房间住了2个人 $k2=$k1;//恰巧今天$k1号房间维修,把$k1号房间的人放到$k2房间里面 $k1=10://假设$k1维修好了,又住进10个人,那么这就是值传递. echo "$k1号房间:".$k1."

  • PHP 引用的概念

    什么是引用? 在 PHP 中引用意味着用不同的名字访问同一个变量内容.它不是C的指针,保存的并不是内存地址,无法进行指针运算.引用只是符号表的别名.就像 Unix 系统中的硬链接, Windows 系统中的快捷方式. 上面是官方手册中的原文,怎么说呢,引用其实和我们印象中的C里面的指针并不是相同的概念.指针是针对真实内存的操作,引用是针对指向这个内存的符号表的操作.还是从操作系统的快捷方式来说,快捷方式是可以删的,这就是PHP的引用.而C不仅删了快捷方式,还把原文件也给删了,这就是C的指针操作.

  • php中对象引用和复制实例分析

    本文实例讲述了php中对象引用和复制.分享给大家供大家参考,具体如下: 引用 $tv2 = $tv1; 或者 $tv2 = &$tv1; 以上两种方式,效果是一样的.可以理解为linux里面的硬链接. 克隆(浅复制) $tv2 = clone $tv1; "浅复制":被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象.也就是说,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 深复制 $tv4 = unserialize(seria

  • php的对象传值与引用传值代码实例讲解

    变量赋值与对象赋值对比 <?php // 声明一个变量并赋值 $a = 1; // 将数据类型的值 赋值 给一个变量 $b = $a; // 修改$a的值 $a = 2; // $a和$b是两个独立的内存空间修改其中一个另一个不受影响 echo $b; // 1 class Person{ public $name; public $age; } // 将对象类型的数据 赋值 给一个变量 $p = new Person; // 通过对属性修改值,来确定面向对象中 对象的传值方式 $p->nam

  • PHP 弱引用的相关总结

    目录 什么是弱引用 WeakReference 注意 测试代码: 之前的文章中,我们已经学习过引用和引用传值相关的知识.我们知道,PHP 中没有纯引用(指针),不管是对象,还是用引用符号 & 赋值的变量,都是对一个符号表的引用.而今天,我们要学习的是另一种引用形式:弱引用. 什么是弱引用 弱引用允许程序员保留对对象的引用,而该对象不会阻止对象被销毁:它们对于实现类似缓存的结构非常有用. 这是比较官方的解释.从这个说明中,我们可以看出,弱引用也是一种引用形式,但是,如果我们销毁了原来的对象,那么弱

  • iOS中的集合该如何弱引用对象示例详解

    前言 本文主要给大家介绍了关于iOS集合弱引用对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1. 使用 NSValue NSValue 可以弱引用保存一个对象,我们可以使用这种方法间接的引用. NSValue *value = [NSValue valueWithNonretainedObject:@selector(class)]; [array addObject:value]; 2. 使用 NSPointerArray,NSMapTable,NSHash

  • Android利用软引用和弱引用避免OOM的方法

    想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题. 一.了解 强引用.软引用.弱引用.虚引用的概念 在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了. 从Java SE2开始,就提供了四种类型的引用:强引用.软引

  • Swift源码解析之弱引用

    序言: 各个社区有关 Objective-C weak 机制的实现分析文章有很多,然而 Swift 发布这么长时间以来,有关 ABI 的分析文章一直非常少,似乎也是很多 iOS 开发者未涉及的领域- 本文就从源码层面分析一下 Swift 是如何实现 weak 机制的. 下面话不多说了,来一起看看详细的介绍吧 准备工作 由于 Swift 源码量较大,强烈建议大家把 repo clone 下来,结合源码一起来看这篇文章. $ git clone https://github.com/apple/sw

  • 详解Java弱引用(WeakReference)的理解与使用

    看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他. 无疑, 在interviewer眼中, 对于weak reference的理

  • 详解JAVA 弱引用

    定义 弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型.在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收. 说明 弱引用,从名字来看就很弱嘛,这种引用指向的对象,一旦在GC时被扫描到,就逃脱不了被回收的命运. 但是,弱引用指向的对象也并不一定就马上会被回收,如果弱引用对象较大,直接进到了老年代,那么就可以苟且偷生到Full GC触发前,所以弱引用对象也可能存在较长的一段时间.一旦一个弱引用对象被垃圾回收器回收,便

  • Java 中的弱引用是什么

    Java里一个对象obj被创建时,被放在堆里.当GC运行的时候,发现没有任何引用指向obj,那么就会回收obj对象的堆内存空间. 换句话说,一个对象被回收, 必须满足两个条件: (1)没有任何引用指向它 (2)GC被运行. 在实际开发中,我们可以通过把所有指向某个对象的referece置空来保证这个对象在下次GC运行的时候被回收,类似下面: Object c = new Car(); c=null; 但是,这样做是一件很繁琐并且违背GC自动回收原则的事.对于简单的情况, 手动置空是不需要程序员来

  • C语言中弱符号与弱引用的实际应用

    最近在学习<程序员的自我修养--链接.装载与库>时,get到了一个新的知识点:弱符号与弱引用.书中简短的介绍,让我了解到弱符号的含义以及使用方式.了解我的朋友,应该知道我喜欢将知识点与我们实际工作结合起来,在工作中利用起来,正所谓学以善用.根据我的理解,觉得利用弱符号的特性可以帮组我们在工作中编写出更加稳定,可复用,可组合的优秀代码.在此向大家分享. 符号重定义错误 在编码过程中,我们经常遇到符号重定义的错误.编译器会报如下错误: multiple definition of `xxx'; 这

  • C 语言的弱符号与弱引用你了解吗

    目录 C语言中的__attribute__((weak)) 与 attribute ((weakref()) 弱符号 弱符号的作用与示例 弱引用 测试代码1: 测试代码2: 总结 C语言中的__attribute__((weak)) 与 attribute ((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 C 语言中的高级特性.本节就来谈一谈 C 语言中的弱符号和弱引用的用法. 弱符号 弱符号是指在定义或者声明一个对象(变量.结

  • Java中的强引用,软引用,弱引用,虚引用的作用介绍

    目录 1.强引用(StrongReference) 2.软引用(SoftReference) 3.弱引用(WeakReference) 4.虚引用(PhantomReference) 5.强引用>软引用>弱引用>虚引用 1.强引用( Strong Reference ) 最普遍的引用:Object obj=new Object()抛出OutOfMemoryError终止程序也不会回收具有强引用的对象通过将对象设置为null来弱化引用,使其被回收 2.软引用( Soft Reference

随机推荐