亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
可變創(chuàng)建和內存分配
參考計數(shù)和抄寫
範圍和不安排:參考降低時
垃圾收集:清理週期
摘要:完整的生命週期
首頁 後端開發(fā) php教程 PHP變量的生命週期:從分配到垃圾收集

PHP變量的生命週期:從分配到垃圾收集

Jul 24, 2025 pm 10:49 PM
PHP Variables

PHP變量的生命週期從Zval Creation通過內存分配開始,該創(chuàng)建存儲了值,類型,參考計數(shù)和參考標誌。 2。當分配或共享變量時,PHP會使用參考計數(shù)和編寫編寫件來優(yōu)化內存使用情況,僅在必要時重複數(shù)據(jù)。 3。在示波器出口或unset()之後,參考計數(shù)減小,如果達到零,則立即釋放內存。 4。對於參考計數(shù)永遠不會達到零的圓形參考,PHP的環(huán)狀垃圾收集器可以識別並清理了無法實現(xiàn)的周期。 5。最終將內存返回到系統(tǒng)或重複使用,以確保整個變量的生命週期中有效的資源管理。

PHP變量的生命週期:從分配到垃圾收集

php變量不僅僅出現(xiàn)在稀薄的空氣中 - 從分配一個值的那一刻,它會經過明確的生命週期。了解此生命週期可幫助您更有效地編寫更有效,可預測的代碼和調試內存問題。讓我們?yōu)g覽PHP如何處理從創(chuàng)建到清理的引擎蓋下的變量。

PHP變量的生命週期:從分配到垃圾收集

可變創(chuàng)建和內存分配

當您寫類似的東西時:

 $數(shù)字= 42;

PHP不僅存儲該值,還可以為Zval (Zend值)分配內存,該內部結構包含有關變量的所有信息。

PHP變量的生命週期:從分配到垃圾收集

zval包含:

  • 實際值(例如42
  • 類型(例如, IS_LONG
  • 參考計數(shù)(用於參考計數(shù))
  • 指示是否是參考的標誌

此時,參考計數(shù)設置為1,因為一個變量( $number )指向此zval 。

PHP變量的生命週期:從分配到垃圾收集

該分配發(fā)生在PHP的Userland內存空間中,由Zend Engine管理。確切的位置(堆棧或堆)取決於上下文 - 功能中的局部變量可能存在在堆棧上,而復雜或長壽命值則在堆上。


參考計數(shù)和抄寫

當不再需要變量時,PHP使用參考計數(shù)作為其主要的跟蹤機制。

讓我們擴展一個示例:

 $ a =“ Hello”;
$ b = $ a; // $ a和$ b指向同一zval

現(xiàn)在, zval持有"hello"的參考數(shù)數(shù)為2。但是PHP並未立即製作完整的副本 - 它使用了抄寫(牛)優(yōu)化。

如果您以後修改$b

 $ b =“世界”;

PHP檢測到zval是否共享且未實際引用(即,不是真實的參考文獻& ),因此它為$b創(chuàng)建了一個新的zval ,減少了舊的人數(shù),並分配了新值。這避免了不必要的重複並節(jié)省內存。

但是如果您這樣做:

 $ b =&$ a;

現(xiàn)在,這兩個變量都是對同一zval真實引用。修改一個會影響另一個,參考計數(shù)增加 - 但更重要的是,設置了is_ref標誌,這會改變未來作業(yè)的行為方式。


範圍和不安排:參考降低時

當功能結束時,變量自然會脫離範圍:

函數(shù)engry(){
    $ message =“嗨!”;
    // $消息存在
}
// $消息現(xiàn)在不超出範圍

當功能退出時,該範圍的符號表將被破壞。它的每個變量都減少了其zval的參考計數(shù)。如果計數(shù)達到零,則PHP可以立即釋放內存。

您還可以用unset()手動減少計數(shù):

 $ a = [1,2,3];
unset($ a); //參考計數(shù)下降;如果沒有其他裁判,Zval將被釋放

注意: unset()不一定是免費內存 - 它只是刪除了變量的參考。如果另一個變量(例如$b = $a )共享相同的zval ,則計數(shù)下降,但值仍然存在。


垃圾收集:清理週期

參考計數(shù)效果很好 - 直到您擊中循環(huán)引用

例子:

 $ a = [];
$ b = [];
$ a ['b'] = $ b;
$ b ['a'] = $ a;

//現(xiàn)在都不設置
Unset($ a,$ b);

即使在不設置之後,兩個zvals仍然彼此指向,因此他們的參考計數(shù)為1,而不是0。它們無法到達但無法釋放 - 記憶洩漏。

這是PHP的環(huán)狀垃圾收集器介入的地方。

PHP運行一個週期性的垃圾收集週期(用gc_collect_cycles()或在某些條件下自動觸發(fā)):

  1. 尋找?guī)в袇⒖加嫈?shù)> 0的zvals ,這些ZVAL無法從根符號表中達到
  2. 使用根緩衝區(qū)和深度優(yōu)先搜索來識別週期
  3. 如果將周期確認為垃圾,則可以釋放記憶

您可以控制此行為:

  • gc_enable() / gc_disable() - 切換GC
  • gc_collect_cycles() - 力收集
  • gc_status() - 檢查,收集,內存使用

摘要:完整的生命週期

  1. 分配:分配值時會創(chuàng)建zval 。
  2. 用法:變量可以通過寫入或真實引用共享。
  3. 範圍出口 /未設置:參考計數(shù)下降;如果零,則釋放內存。
  4. 循環(huán)檢測:如果參考計數(shù)由於週期而永遠不會達到零,則GC介入。
  5. 清理:存儲器返回到系統(tǒng)(或保存在PHP的內存管理器中)。

了解此流程有助於您避免常見的陷阱 - 例如,捕獲對象的封閉中的內存洩漏或變量之間的意外共享。雖然PHP自動處理大部分,但了解變量何時以及如何變化使您成為更好的PHP開發(fā)人員。

基本上:PHP很聰明,但不是魔術。

以上是PHP變量的生命週期:從分配到垃圾收集的詳細內容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

通過參考與函數(shù)中的值傳遞變量 通過參考與函數(shù)中的值傳遞變量 Jul 26, 2025 am 09:49 AM

Passbyvaluemeansacopyofthedataispassed,sochangesinsidethefunctiondonotaffecttheoriginalvariable,asseeninCwithprimitivesorPythonwithimmutabletypes.2.Passbyreferencemeansthefunctionreceivesadirectreferencetotheoriginal,somodificationsinsidethefunctiona

反對'全局”關鍵字的情況:清潔劑的策略 反對'全局”關鍵字的情況:清潔劑的策略 Jul 25, 2025 am 11:36 AM

Avoidusingtheglobalkeywordunnecessarilyasitleadstocodethatishardertotest,debug,andmaintain;instead,usefunctionparametersandreturnvaluestopassdataexplicitly.2.Replaceglobalvariableswithpurefunctionsthatdependonlyontheirinputsandproduceoutputswithoutsi

PHP變量的生命週期:從分配到垃圾收集 PHP變量的生命週期:從分配到垃圾收集 Jul 24, 2025 pm 10:49 PM

APHPvariable'slifecyclebeginswithmemoryallocationviazvalcreation,whichstoresthevalue,type,referencecount,andreferenceflag.2.Whenvariablesareassignedorshared,PHPusesreferencecountingandcopy-on-writetooptimizememoryusage,onlyduplicatingdatawhennecessar

使用PHP打字屬性使您的課程現(xiàn)代化 使用PHP打字屬性使您的課程現(xiàn)代化 Jul 26, 2025 am 09:49 AM

TypedpropertiesinPHP7.4 allowdirecttypedeclarationforclassproperties,improvingreliability,IDEsupport,andcodeclarity;2.Theyenforcetypesafety,reducebugs,enablebetterautocompletion,andminimizeconstructorchecks;3.Tomigrate,useexisting@vardocblockstoaddty

揭開PHP的變量變量($$ var') 揭開PHP的變量變量($$ var') Jul 25, 2025 am 04:42 AM

變量變量通過$$var語法將一個變量的值作為另一個變量的名稱使用;2.例如當$myVar為"hello"時,$$myVar等價於$hello,並可為其賦值;3.實際應用中可用於動態(tài)處理表單數(shù)據(jù),如用foreach遍歷$_POST並用$$key創(chuàng)建對應變量;4.存在可讀性差、安全風險高、破壞靜態(tài)分析等問題,尤其避免對用戶輸入使用$$;5.推薦使用數(shù)組或對象替代,如將數(shù)據(jù)存入$data數(shù)組而非創(chuàng)建動態(tài)變量;6.使用${$var}花括號語法可提高代碼清晰度,尤其在復雜場景中。變量變

PHP常數(shù)與變量:不變性指南 PHP常數(shù)與變量:不變性指南 Jul 25, 2025 pm 05:37 PM

constantscannotbechangedafterDefinition,whervariablescan; 1.VariablestArtwith $,可恢復,範圍,範圍,andidealfordynamicdata; 2.constantsusedefine(constantsusedefine ofconst,haveno $,haveno $,haveno $,atemmmutable as pemmmmmutable'esmmmmmtable,全球範圍內,全球範圍內,且forfixeDValuseLikeNunchforforfforFforforForfortorlationlation; 3.UseNforation;

`iSSET()`,`empty()`和`is_null()的細微差別用於可變驗證 `iSSET()`,`empty()`和`is_null()的細微差別用於可變驗證 Jul 24, 2025 pm 10:15 PM

ISSET()checksifavariableisdeclaredAndNotNull,returningTrueForEmptyStrings,0,'0',false和emptertyrays; useittoconfirmavariableExistSistsandHasbeEnset,sustAsAsverifyingingformInputslike $ _post $ _post $ _post ['email'emage''] 2.ementify('emplienify()

See all articles