国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
什麼是弱參考?
您什麼時(shí)候可以使用它?
緩存數(shù)據(jù)而無需保持對(duì)象
管理事件聽眾沒有內(nèi)存洩漏
局限性和替代方案
首頁 後端開發(fā) php教程 PHP中有哪些弱參考(弱圖),何時(shí)有用?

PHP中有哪些弱參考(弱圖),何時(shí)有用?

Jun 14, 2025 am 12:25 AM
php 弱報(bào)價(jià)

PHP沒有內(nèi)置的弱圖,但為類似功能提供了弱的縮影。 1。弱Reference允許持有參考,而無需阻止垃圾收集。 2。它對(duì)緩存,事件聽眾和元數(shù)據(jù)很有用,而不會(huì)影響對(duì)像生命週期。 3。您可以使用spl_object_hash使用fealReference模擬弱圖。 4。限制包括手動(dòng)映射和有限的框架支持。 5。用例包括必須避免內(nèi)存洩漏的記憶,事件系統(tǒng)和ORM。

PHP中有哪些弱參考(弱圖),何時(shí)有用?

PHP沒有JavaScript或Java之類的內(nèi)置弱圖實(shí)現(xiàn),但它確實(shí)提供了WeakReference類(在PHP 7.4中引入),該類別提供了類似的行為。因此,如果您詢問PHP中的弱參考和虛弱圖,我們真正談?wù)摰氖侨绾问褂?code>WeakReference來模仿某些功能。

什麼是弱參考?

弱參考是對(duì)不會(huì)阻止對(duì)像被收集的對(duì)象的引用。相比之下,只要參考存在,正常的(或強(qiáng))參考就可以使對(duì)象保持活力。

在PHP中, WeakReference使您可以在不增加其參考計(jì)數(shù)的情況下保留對(duì)對(duì)象的引用。一旦原始對(duì)像沒有更多的引用指向它,它就會(huì)符合垃圾收集的條件 - 即使仍然有WeakReference實(shí)例指向它。

當(dāng)您想將數(shù)據(jù)與對(duì)象相關(guān)聯(lián)而不會(huì)影響其生命週期時(shí),這很有用。

您什麼時(shí)候可以使用它?

在一些具體情況下,使用WeakReference可能會(huì)有所幫助:

  • 與對(duì)象壽命相關(guān)的緩存或回憶
  • 事件聽眾或觀察者不應(yīng)使對(duì)象活著
  • 需要臨時(shí)元數(shù)據(jù)的ORMS或DI容器

讓我們看一些實(shí)際的例子。


緩存數(shù)據(jù)而無需保持對(duì)象

想像一下,您正在建立一個(gè)系統(tǒng),要根據(jù)某些對(duì)象來緩存計(jì)算值的系統(tǒng) - 例如,用戶配置文件圖像URL來自用戶對(duì)象。如果將它們存儲(chǔ)在常規(guī)陣列或地圖中,那麼即使在您的應(yīng)用程序中其他地方不再需要它們之後,用戶對(duì)像也不會(huì)收集垃圾。

使用WeakReference ,您可以構(gòu)建一種“緩存”,當(dāng)關(guān)聯(lián)對(duì)像被破壞時(shí),該“緩存”會(huì)自動(dòng)清除自身。

 $ CACHE = [];

函數(shù)getProfileurl(object $ user):字符串{
    全局$緩存;

    $ hash = spl_object_hash($ user);

    if(isset($ cache [$ hash])){
        返回$ CACH [$ HASH];
    }

    //模擬昂貴的計(jì)算
    $ url ='https://example.com/profile/'。 MD5($ user-> id);

    $ CACH [$ HASH] = $ URL;
    返回$ url;
}

為了使這種弱,請(qǐng)用WeakReference包裹對(duì)象:

 $ CACHE = [];

$ user =新用戶(123);
$ ref = fealReference :: create($ user);

$ CACH [spl_object_hash($ user)] = $ ref;

// 之後...
if($ cache ['some_hash']  - > get()){
    迴聲'仍然在附近! ';
} 別的 {
    迴聲'已經(jīng)走了。 ';
}

這樣,一旦$user不超出範(fàn)圍,緩存的條目就會(huì)無關(guān)緊要,並且不會(huì)阻止垃圾收集。


管理事件聽眾沒有內(nèi)存洩漏

另一個(gè)常見的情況是事件系統(tǒng),在該系統(tǒng)中,可能會(huì)針對(duì)長(zhǎng)壽對(duì)象進(jìn)行註冊(cè)。如果這些聽眾對(duì)短壽命對(duì)像有很大的引用,則可能導(dǎo)致內(nèi)存洩漏。

通過使用WeakReference ,您可以確保聽眾不會(huì)不必要地使對(duì)象保持活力。

例如:

類EventManager {
    私人$聽眾= [];

    public函數(shù)addListener(object $ target,callable $ callback){
        $ hash = spl_object_hash($ target);
        $ this->偵聽器[$ hash] = fealReference :: create($ target);
        //在這裡存儲(chǔ)回調(diào)邏輯...
    }

    公共功能triggerevent(){
        foreach($ this->聽眾$ hash => $ ref){
            $ target = $ ref-> get();
            如果($ target === null){
                unset($ this->聽眾[$ hash]);
                繼續(xù);
            }
            //請(qǐng)調(diào)用回調(diào),如果目標(biāo)仍然存在
        }
    }
}

這僅僅是因?yàn)樗诼犚粋€(gè)事件,避免了$target活力。


局限性和替代方案

雖然WeakReference強(qiáng)大,但它有局限性:

  • 沒有本機(jī)WeakMap - 您必須使用spl_object_hash管理映射
  • 並非所有的框架或庫支持或期望參考弱
  • 調(diào)試與對(duì)象壽命有關(guān)的問題可能很棘手

如果您正在尋找一種更具結(jié)構(gòu)化的方法,則某些軟件包通過結(jié)合WeakReference和關(guān)聯(lián)陣列來提供類似WeakMap的實(shí)現(xiàn)。這些通常在ORM或容器庫中內(nèi)部使用。


因此,儘管PHP沒有像其他語言那樣具有完整的WeakMap ,但WeakReference可以為您提供足夠的能力來模擬它。當(dāng)您想將數(shù)據(jù)與對(duì)象聯(lián)繫起來時(shí),請(qǐng)使用它,而不會(huì)干擾其自然生命週期 - 諸如緩存,元數(shù)據(jù)或觀察者模式之類的東西最有益。

這不是您每天都能到達(dá)的東西,但是當(dāng)您需要時(shí),這正是您所需要的。

以上是PHP中有哪些弱參考(弱圖),何時(shí)有用?的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? 我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? Jun 22, 2025 am 01:00 AM

TovalidateuserinputinPHP,usebuilt-invalidationfunctionslikefilter_var()andfilter_input(),applyregularexpressionsforcustomformatssuchasusernamesorphonenumbers,checkdatatypesfornumericvalueslikeageorprice,setlengthlimitsandtrimwhitespacetopreventlayout

什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? 什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? Jun 22, 2025 am 01:03 AM

thephpfunctionserize()andunSerialize()redustoconvertComplexdatStructDestoresToroStoroStoroSandaBackagagain.1.Serialize()

如何將PHP代碼嵌入HTML文件中? 如何將PHP代碼嵌入HTML文件中? Jun 22, 2025 am 01:00 AM

可以將PHP代碼嵌入HTML文件中,但需確保文件以.php為擴(kuò)展名,以便服務(wù)器能正確解析。使用標(biāo)準(zhǔn)的標(biāo)籤包裹PHP代碼,可在HTML中任意位置插入動(dòng)態(tài)內(nèi)容。此外,可在同一文件中多次切換PHP與HTML,實(shí)現(xiàn)條件渲染等動(dòng)態(tài)功能。務(wù)必注意服務(wù)器配置及語法正確性,避免因短標(biāo)籤、引號(hào)錯(cuò)誤或遺漏結(jié)束標(biāo)籤導(dǎo)致問題。

編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什麼? 編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什麼? Jun 24, 2025 am 12:53 AM

寫乾淨(jìng)、易維護(hù)的PHP代碼關(guān)鍵在於清晰命名、遵循標(biāo)準(zhǔn)、合理結(jié)構(gòu)、善用註釋和可測(cè)試性。 1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標(biāo)準(zhǔn)統(tǒng)一代碼風(fēng)格;3.按職責(zé)拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免麵條式代碼,將邏輯拆分為單一職責(zé)的小函數(shù);5.在關(guān)鍵處添加註釋並撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測(cè)試性,採(cǎi)用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和後期維護(hù)便利性。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

See all articles