學習須要知其然而知其因此然,PHP底層相關就是這類知識。面試
前面寫過一篇《PHP底層分析:關於寫時複製(cow)》:http://www.javashuo.com/article/p-bpquesnv-r.html
今天來說講關於強制分裂的知識,簡單來講,強制分裂就是」在引用變量主動賦值前,該變量傳值賦值過,就會發生強制分裂。」segmentfault
話提及來比較繞,看下代碼解析吧。學習
看下面的代碼:
spa
稍微熟悉 PHP:&引用符號都應該能夠看出,output分別爲gzchen,傍晚八點半,gzchen。blog
那麼咱們來看看以上代碼的底層運行流程吧。內存
衆所周知,一個變量就是一個結構體,長成下面這樣:
開發
每一行都寫了註釋,此文件在zend.h在PHP源碼Zend的目錄下。get
當代碼運行到line:3[$name = ‘傍晚八點半’]的時候,內存中的結構體長這樣:
源碼
當代碼運行到line:4[$myName = $name]的時候,結構體變成這樣:it
運行到line:5[$nameCopy = &$name]和line:[$nameCopy = ‘gzchen’],是這樣:
△△△此處,此處,就是此處發生了強制分裂。
當is_ref__gc[引用屬性]從0->1,若是refcont_gc>1,那麼就會發生強制分裂。僞代碼就是:
這個就是強制分裂。本來已經通過傳值賦值的變量,再次引用賦值出去。被傳值賦值的變量就會被分裂出一個結構體,在這裏是$myName。
實際開發基本用不到這層原理,但在面試中強制分裂一般會和寫時複製(cow)一塊兒考。