如題,如果我這麼建立代碼
假如有一個Apple這個類。
function abc(){ $a = new Apple(); return a;}$a = abc();$name = $a -> getname();......
經過上述這麼調用後,是不是$a就不會自動被PHP垃圾處理器回收?
回複內容:
如題,如果我這麼建立代碼
假如有一個Apple這個類。
function abc(){ $a = new Apple(); return a;}$a = abc();$name = $a -> getname();......
經過上述這麼調用後,是不是$a就不會自動被PHP垃圾處理器回收?
struct _zval_struct {
zvalue_value value; unsigned char type; unsigned char is_ref;short refcount;
};
value:變數的值
type:變數的類型
is_ref:變數是否被引用
refcount:引用次數
重點在is_ref,如果為false,說明當前沒有被按引用引用,且refcount為0時,則PHP記憶體回收機制會將其回收。
備忘:函數中的$a在函數執行完畢後,立刻被回收。函數外的$a,必須被手動銷毀,要麼就是指令碼執行完畢後,變數$a被銷毀!
函數中的$a的話,函數執行完就被釋放了。
函數外的$a如果你不unset的話,在指令碼執行完之前都會存在。
函數中建立的Apple對象的話,因為你把它作為傳回值,函數外的$a還儲存著對Apple對象的引用,所以不會被回收。除非你把函數外的$a給unset了或者修改了它的值,使得沒有對Apple對象的引用了,Apple對象才會被回收。
變數引用次數為零自然會被回收
確定後面不再使用全域變數$a,那執行unset($a)
釋放掉就好了.
PHP的記憶體回收是基於引用計數實現的,具體看官方文檔:
http://php.net/manual/zh/features.gc.php