PHP 弱引用的相關(guān)總結(jié)
之前的文章中,我們已經(jīng)學(xué)習(xí)過引用和引用傳值相關(guān)的知識(shí)。我們知道,PHP 中沒有純引用(指針),不管是對(duì)象,還是用引用符號(hào) & 賦值的變量,都是對(duì)一個(gè)符號(hào)表的引用。而今天,我們要學(xué)習(xí)的是另一種引用形式:弱引用。
什么是弱引用
弱引用允許程序員保留對(duì)對(duì)象的引用,而該對(duì)象不會(huì)阻止對(duì)象被銷毀;它們對(duì)于實(shí)現(xiàn)類似緩存的結(jié)構(gòu)非常有用。
這是比較官方的解釋。從這個(gè)說明中,我們可以看出,弱引用也是一種引用形式,但是,如果我們銷毀了原來的對(duì)象,那么弱引用對(duì)象也會(huì)被銷毀,就像普通的值對(duì)象賦值一樣。如果沒有看過之前的文章,或者對(duì) PHP 中的引用不太熟悉的朋友可能需要再了解一下 PHP 中引用相關(guān)的知識(shí)。下面,我們直接通過示例來看一下。
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
第一個(gè)對(duì)象 \$obj 我們進(jìn)行直接的賦值引用,也就是 PHP 默認(rèn)的對(duì)象賦值。這時(shí)候,$weakref 保存的是對(duì)象符號(hào)表的引用。當(dāng)我們 unset() 掉 $obj 時(shí),$weakref 依然能夠正常使用。也就是說,$weakref 對(duì) $obj 原始對(duì)象的內(nèi)存引用依然保持著。不管我們?cè)趺?unset() 原始的 $obj ,都只是切斷了 $obj 的引用符號(hào)表,對(duì)真正的對(duì)象沒有影響,垃圾回收器也不會(huì)徹底的回收最最原始的 $obj 對(duì)象內(nèi)容。
第二個(gè)對(duì)象我們使用的是 WeakReference 的 create() 方法來創(chuàng)建的弱引用,當(dāng)我們銷毀 $obj1 后,$weakref 也會(huì)變成 NULL 。這就是弱引用的作用!
它可以讓垃圾回收器正常的回收,它可以避免循環(huán)引用帶來的內(nèi)存泄漏問題,它能讓引用表現(xiàn)為類似于 C 中的指針操作一樣。
最后一段代碼是我們通過 WeakReference::create() 中直接使用 new 來創(chuàng)建對(duì)象。這種形式是不行的,會(huì)一直返回 NULL 。因?yàn)槿跻檬峭ㄟ^變量來創(chuàng)建的,它指向的是原始對(duì)象的符號(hào)表,而變量和對(duì)象之間的符號(hào)表連接才是弱引用關(guān)心的內(nèi)容,它會(huì)根據(jù)符號(hào)表的狀態(tài)來判斷當(dāng)前的狀態(tài)。如果原始對(duì)象變量切斷了與符號(hào)表的連接,那么弱引用的變量也會(huì)同步切斷,這樣,垃圾回收器就能正常的清理這個(gè)已經(jīng)沒有任何引用計(jì)數(shù)的對(duì)象了。
注意
這里需要注意的是,上面的測試代碼必須在 PHP7.4 及以上版本才有用,WeakReference 類是 PHP7.4 新增加的內(nèi)容。之前的版本需要安裝 WeakRef 這個(gè)擴(kuò)展才能實(shí)現(xiàn)弱引用的能力,具體的內(nèi)容可以查閱下方鏈接中的相關(guān)的文檔。
測試代碼:
https://github.com/zhangyue0503...
以上就是PHP 弱引用的相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于PHP 弱引用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php讀取出一個(gè)文件夾及其子文件夾下所有文件的方法示例
這篇文章主要介紹了php讀取出一個(gè)文件夾及其子文件夾下所有文件的方法,涉及php遞歸及文件路徑相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
自己在做項(xiàng)目過程中學(xué)到的PHP知識(shí)收集
以前沒學(xué)過PHP,最近剛好一個(gè)項(xiàng)目需要用到,我就決定一邊學(xué)一邊做PHP2012-08-08
PHP實(shí)現(xiàn)設(shè)計(jì)模式中的抽象工廠模式詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)設(shè)計(jì)模式中的抽象工廠模式詳解,抽象工廠模式(Abstact Factory)是一種常見的軟件設(shè)計(jì)模式,需要的朋友可以參考下2014-10-10
教你如何在CI框架中使用 .htaccess 隱藏url中index.php
CodeIgniter(以下簡稱"CI")是一款國外優(yōu)秀的PHP輕量級(jí)MVC框架,它支持PHP4和PHP5,是開發(fā)中小型可拓展性需求高的Web應(yīng)用程序的利器。很多博客程序,開源的cms程序,都是采用CI進(jìn)行的編寫。2014-06-06
PHP 5.3和PHP 5.4出現(xiàn)FastCGI Error解決方法
這篇文章主要介紹了PHP 5.3和PHP 5.4出現(xiàn)FastCGI Error解決方法,需要的朋友可以參考下2015-02-02

