佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > PHP 弱引用的相關(guān)總結(jié)

PHP 弱引用的相關(guān)總結(jié)

熱門(mén)標(biāo)簽:阿里云 電子圍欄 Mysql連接數(shù)設(shè)置 Linux服務(wù)器 銀行業(yè)務(wù) 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 團(tuán)購(gòu)網(wǎng)站 服務(wù)器配置

之前的文章中,我們已經(jīng)學(xué)習(xí)過(guò)引用和引用傳值相關(guān)的知識(shí)。我們知道,PHP 中沒(méi)有純引用(指針),不管是對(duì)象,還是用引用符號(hào) 賦值的變量,都是對(duì)一個(gè)符號(hào)表的引用。而今天,我們要學(xué)習(xí)的是另一種引用形式:弱引用。

什么是弱引用

弱引用允許程序員保留對(duì)對(duì)象的引用,而該對(duì)象不會(huì)阻止對(duì)象被銷(xiāo)毀;它們對(duì)于實(shí)現(xiàn)類(lèi)似緩存的結(jié)構(gòu)非常有用。

這是比較官方的解釋。從這個(gè)說(shuō)明中,我們可以看出,弱引用也是一種引用形式,但是,如果我們銷(xiāo)毀了原來(lái)的對(duì)象,那么弱引用對(duì)象也會(huì)被銷(xiāo)毀,就像普通的值對(duì)象賦值一樣。如果沒(méi)有看過(guò)之前的文章,或者對(duì) PHP 中的引用不太熟悉的朋友可能需要再了解一下 PHP 中引用相關(guān)的知識(shí)。下面,我們直接通過(guò)示例來(lái)看一下。

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 依然能夠正常使用。也就是說(shuō),$weakref 對(duì) $obj 原始對(duì)象的內(nèi)存引用依然保持著。不管我們?cè)趺?unset() 原始的 $obj ,都只是切斷了 $obj 的引用符號(hào)表,對(duì)真正的對(duì)象沒(méi)有影響,垃圾回收器也不會(huì)徹底的回收最最原始的 $obj 對(duì)象內(nèi)容。

第二個(gè)對(duì)象我們使用的是 WeakReference 的 create() 方法來(lái)創(chuàng)建的弱引用,當(dāng)我們銷(xiāo)毀 $obj1 后,$weakref 也會(huì)變成 NULL 。這就是弱引用的作用!

它可以讓垃圾回收器正常的回收,它可以避免循環(huán)引用帶來(lái)的內(nèi)存泄漏問(wèn)題,它能讓引用表現(xiàn)為類(lèi)似于 C 中的指針操作一樣。

最后一段代碼是我們通過(guò) WeakReference::create() 中直接使用 new 來(lái)創(chuàng)建對(duì)象。這種形式是不行的,會(huì)一直返回 NULL 。因?yàn)槿跻檬峭ㄟ^(guò)變量來(lái)創(chuàng)建的,它指向的是原始對(duì)象的符號(hào)表,而變量和對(duì)象之間的符號(hào)表連接才是弱引用關(guān)心的內(nèi)容,它會(huì)根據(jù)符號(hào)表的狀態(tài)來(lái)判斷當(dāng)前的狀態(tài)。如果原始對(duì)象變量切斷了與符號(hào)表的連接,那么弱引用的變量也會(huì)同步切斷,這樣,垃圾回收器就能正常的清理這個(gè)已經(jīng)沒(méi)有任何引用計(jì)數(shù)的對(duì)象了。

注意

這里需要注意的是,上面的測(cè)試代碼必須在 PHP7.4 及以上版本才有用,WeakReference 類(lèi)是 PHP7.4 新增加的內(nèi)容。之前的版本需要安裝 WeakRef 這個(gè)擴(kuò)展才能實(shí)現(xiàn)弱引用的能力,具體的內(nèi)容可以查閱下方鏈接中的相關(guān)的文檔。

測(cè)試代碼:

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

以上就是PHP 弱引用的相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于PHP 弱引用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • PHP 引用的概念
  • 詳解PHP的引用計(jì)數(shù)
  • php的對(duì)象傳值與引用傳值代碼實(shí)例講解
  • php傳值和傳引用的區(qū)別點(diǎn)總結(jié)
  • php 多個(gè)變量指向同一個(gè)引用($b = &$a)用法分析
  • php引用和拷貝的區(qū)別知識(shí)點(diǎn)總結(jié)
  • php中對(duì)象引用和復(fù)制實(shí)例分析
  • PHP實(shí)現(xiàn)無(wú)限極分類(lèi)的兩種方式示例【遞歸和引用方式】
  • PHP中引用類(lèi)型和值類(lèi)型功能與用法示例

標(biāo)簽:棗莊 萍鄉(xiāng) 衢州 江蘇 廣元 衡水 蚌埠 大理

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP 弱引用的相關(guān)總結(jié)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266
    日照市| 盐津县| 沙坪坝区| 古浪县| 武威市| 周至县| 洱源县| 怀远县| 海兴县| 太仆寺旗| 伊宁县| 东安县| 凤庆县| 临江市| 丹寨县| 临泉县| 双峰县| 莫力| 科尔| 凤城市| 溧阳市| 沁阳市| 汨罗市| 威信县| 文登市| 河南省| 胶南市| 宿迁市| 资溪县| 双城市| 民丰县| 个旧市| 新蔡县| 惠安县| 合阳县| 分宜县| 金川县| 和静县| 明星| 林口县| 固始县|