先上圖:
解釋一下這個圖:
(上圖由於粗心,出現了錯誤,其實1000那個值並沒有開闢新的堆內存,只是修改的第一個堆內存的值:把10修改成了1000)
首先,當我們聲明一個變量時(比如$a = 10;),PHP的工作是:把$a這個名字存放在棧內存中,把它的值存放在堆內存中,它們
之間通過某種機制進行綁定(具體是什麼我也不大清楚 --)。
$b = $a; 這個就比較容易理解了:這個時候,PHP的工作是:當我們使用 $a 變量的時候,PHP通過某種機制快速的找到變量相
對應的值,然後把值賦給$b( php把$b存放在棧內存中,把10存放在堆內存中,這個10是通過$a取出來的 )。
$c = &$a; 值引用:兩個變量公用一個堆內存。這時候PHP的工作是: 把$a的綁定機制,複製一份給$c(這時候輸出$c就是$a
的值,$a變量的值變成什麼,$c的值也就是什麼,因爲他們用的是同一個內存空間).
unset($a);銷燬這個變量,注意:PHP銷燬的只是棧內存中$a這個變量,與之對應的堆內存中值並沒有被銷燬。 值是PHP垃圾回收機制
回收的。
簡單談一下PHP垃圾回收機制
PHP運行時,要把所有的代碼加載到內存中運行,運行時會檢測哪些變量沒有被使用,沒有被使用的變量(或者unset掉的變量),
與之相對應堆內存中的值會被PHP釋放掉,運行結束後,釋放所有棧內存和堆內存。
以上內容由博主自己理解並總結的,如有錯誤,萬分感謝各位大佬的指正!