这是比较官方的阐明。从这个解释中,我们可以看出,弱引用也是一种引用形式,但是,如果我们销毁了原来的工具,那么弱引用工具也会被销毁,就像普通的值工具赋值一样。如果没有看过之前的文章,或者对 PHP 中的引用不太熟习的朋友可能须要再理解一下 PHP 中引用干系的知识。下面,我们直接通过示例来看一下。
WeakReference$obj=newstdClass;$weakref=$obj;var_dump($weakref);//object(stdClass)#1(0){//}unset($obj);var_dump($weakref);//object(stdClass)#1(0){//}$obj1=newstdClass;$weakref=WeakReference::create($obj1);var_dump($weakref->get());//object(stdClass)#2(0){//}unset($obj1);var_dump($weakref->get());//NULL$weakref=WeakReference::create(newstdClass);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