2011-04-21 16 views
2

如果我爲函數內部未聲明的變量賦值,那麼當函數終止時該變量會自動取消設置,還是隻在PHP腳本執行完畢後纔會取消設置?垃圾收集如何在PHP中工作?也就是說,本地函數變量如何被清理?

我想確定是否更聰明,以手動取消設置函數內的臨時函數範圍變量,或者不用擔心,因爲它們將被PHP引擎自動取消設置。

+0

雖然問題在標題中有GC,但是這個問題確實在問什麼時候使用unset:http://stackoverflow.com/questions/3298206/php-when-to-use-unset – webbiedave 2011-04-21 21:47:54

回答

4

當函數退出時,變量將被取消設置,除非它有外部引用來保持它「活着」。無論變量佔用的實際內存是否被釋放,完全取決於垃圾收集器。 GC是一個昂貴的操作,PHP只會在需要時調用它(例如內存越來越緊張)。

+1

除非我的知識是出路的日期,沒有任何標記和掃描涉及,只有一個有趣的引用計數(有趣的是因爲PHP處理引用和複製的方式)。內存非常確定地釋放。 – 2011-04-21 21:38:52

+0

@丹尼爾:它已經過時了。見http://www.php.net/manual/de/features.gc.collecting-cycles.php。 – delnan 2011-04-21 21:46:30

+0

@daniel:5.3實現了一個可以打破循環引用的正確垃圾回收器。所以'$ a = &$a;'將不再'楔入'內存中的變量。 – 2011-04-21 21:47:43

0

Zend引擎將爲您進行清理, 根據需要遞減引用計數

+0

Refcounting!= GC並且實際上不如GC強大(它不能收集週期)。幸運的是,自幾次發佈以來,PHP都有了真正的GC。 – delnan 2011-04-21 21:38:03

1

這完全取決於函數的範圍。理論上講,你可以讓你的整個腳本在一個函數的範圍內運行(希望這個函數可以調用其他函數,但仍然是......)。

對於具有最小副作用的合理大小的函數,將對象設置爲完全正常 - 在函數完成時它們的析構函數將被調用(這是未設置的第二個效果),並且它們將被清理在功能完成後的第一個清理週期內啓動。對於涉及在大量對象上創建的更大功能,則手動刪除對象可能會更好。