今天小編給大家分享的是PHP底層分析中強制分裂的講解,簡單來說,強制分裂就是”在引用變量主動賦值前,該變量傳值賦值過,就會發(fā)生強制分裂?!?/p>
浉河網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
話說起來比較繞,看下代碼解析吧。
看下面的代碼:
稍微熟悉 PHP:&引用符號都應(yīng)該可以看出,output分別為gzchen,傍晚八點半,gzchen。
那么我們來看看以上代碼的底層運行流程吧。
眾所周知,一個變量就是一個結(jié)構(gòu)體,長成下面這樣:
每一行都寫了注釋,此文件在zend.h在PHP源碼Zend的目錄下。
當(dāng)代碼運行到line:3[$name = ‘傍晚八點半’]的時候,內(nèi)存中的結(jié)構(gòu)體長這樣:
當(dāng)代碼運行到line:4[name]的時候,結(jié)構(gòu)體變成這樣:
運行到line:5[Misplaced &
name]和line:[$nameCopy = ‘gzchen’],是這樣:
此處,此處,就是此處發(fā)生了強制分裂。
當(dāng)is_ref__gc[引用屬性]從0->1,如果refcont_gc>1,那么就會發(fā)生強制分裂。偽代碼就是:
這個就是強制分裂。原本已經(jīng)經(jīng)過傳值賦值的變量,再次引用賦值出去。被傳值賦值的變量就會被分裂出一個結(jié)構(gòu)體,在這里是$myName。
實際開發(fā)基本用不到這層原理,但在面試中強制分裂通常會和寫時復(fù)制(cow)一起考。
關(guān)于PHP底層分析中強制分裂的講解就分享到這里了,希望以上內(nèi)容可以對大家有一定的參考價值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。