PHP底層分析之關於強制分裂

2020-07-16 10:05:50
學習需要知其然而知其所以然,PHP底層相關就是這類知識。

今天來講講關於強制分裂的知識,簡單來說,強制分裂就是」在參照變數主動賦值前,該變數傳值賦值過,就會發生強制分裂。」

話說起來比較繞,看下程式碼解析吧。

看下面的程式碼:

8c189b9572c2495fea7e2dfafeb942b.png

稍微熟悉 PHP:&參照符號都應該可以看出,output分別為gzchen,傍晚八點半,gzchen。

那麼我們來看看以上程式碼的底層執行流程吧。

眾所周知,一個變數就是一個結構體,長成下面這樣:

ceebbd44751d6286eb697c9f5eaf4ba.png

每一行都寫了註釋,此檔案在zend.h在PHP原始碼Zend的目錄下。

當程式碼執行到line:3[$name = ‘傍晚八點半’]的時候,記憶體中的結構體長這樣:

a91106ef99ed59f5fd604e44c4ce471.png

當程式碼執行到line:4[name]的時候,結構體變成這樣:

6d0886082695783820c8fc9dcc4b920.png

執行到line:5[Misplaced &name]和line:[$nameCopy = ‘gzchen’],是這樣:

e8114bdad804cdd0fada39fed3e11d3.png

此處,此處,就是此處發生了強制分裂。

當is_ref__gc[參照屬性]從0->1,如果refcont_gc>1,那麼就會發生強制分裂。虛擬碼就是:

dd3ec3e217193bd0bb3edd330be24d9.png

這個就是強制分裂。原本已經經過傳值賦值的變數,再次參照賦值出去。被傳值賦值的變數就會被分裂出一個結構體,在這裡是$myName。

實際開發基本用不到這層原理,但在面試中強制分裂通常會和寫時複製(cow)一起考。

更多程式設計相關內容,請關注TW511.COM程式設計入門欄目!

以上就是PHP底層分析之關於強制分裂的詳細內容,更多請關注TW511.COM其它相關文章!