乐趣区

关于php:学习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 这个扩大能力实现弱援用的能力,具体的内容能够查阅下方链接中的相干的文档。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%AD%A6%E4%B9%A0PHP%E5%BC%B1%E5%BC%95%E7%94%A8%E7%9A%84%E7%9F%A5%E8%AF%86.php

参考文档:

https://www.php.net/manual/en/class.weakreference.php

https://www.php.net/manual/zh/book.weakref.php

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

退出移动版