析構函式大家想必都非常熟悉了
php析構函式,相反於建構函式. php呼叫它們來將乙個物件從記憶體中銷毀. 預設地,php僅僅釋放物件屬性所占用的記憶體並銷毀物件相關的資源. 析構函式允許你在使用乙個物件之後執行任意**來清除記憶體.
當php決定你的指令碼不再與物件相關時,php析構函式將被呼叫. 在乙個函式的命名空間內,這會發生在函式return的時候. 對於全域性變數,這發生於指令碼結束的時候. 如果你想明確地銷毀乙個物件,你可以給指向該物件的變數分配任何其它值. 通常將變數賦值勤為null或者呼叫unset .
記得很久之前聽乙個朋友說過,他的__destruct函式不被觸發,非要在程式中unset($obj)或者$obj = null;之後才被觸發,當時一聽之後,雖然覺得很奇怪,但是並沒有動手去檢驗一下,昨天閒來無事隨便寫了個指令碼測試一下。
<?php
class test
public function __destruct ()
public function _log ($str)
}$test = new test;
發現log.log中只有start,沒有finish。
清空log中的內容之後,再修改一下程式:
unset($test);
果然,有了start,又有了finish。
好像真的是要unset才會執行__destruct。
可是事情還沒有結束,我又修改了一下程式,改動了__destruct函式,同時刪除了unset這句**:
public function __destruct ()
這時候螢幕上居然列印出了『finish』,這樣就證明析構函式確實是被執行到了。
百思不得其解之後,開始上網找資料,看到一位朋友些的析構函式中用到了error_log並被執行了,和我用法不同的是他並沒有指定error_log的檔案,而是到預設的log檔案,於是我模擬了一下,又修改了我的程式:
public function _log ($str)
我發現log.log中仍然之後start,沒有finish
奇怪的問題,想不通,於是去群裡面問了下,群裡的朋友要麼讓我檢查語法錯誤,要麼檢查檔案許可權,我確定這兩個沒有任何問題。
我說「windows系統,不存在許可權問題,肯定不是這個引起的」
乙個群友說:「windos系統,不解釋!」
我說:「這肯定和系統沒關係,我懷疑是apache的問題。」
於是我把_log還原了一下,到linux+nginx的虛擬機器上跑了一下。
public function _log ($str)
log.log中成功寫入了start和finish。
這讓我更加懷疑我的判斷:apache導致的
於是折騰了乙個小時,在伺服器上裝了apache並執行了一下檔案,還是同樣的結果,finish並沒有成功寫入。
這時候乙個同事跟我說,你寫絕對路徑試試看,於是我又修改了乙個_log
public function _log ($str)
再觀察一下,成功寫入「finish」,激動啊,終於找到問題了,我又修改了一下程式
public function __construct()
public function __destruct ()
檢視執行結果:
/var/www/apache
/
再到nginx伺服器下執行,得到結果
/var/www/apache
/var/www/apache
真相大白,原來apache的析構函式會改變當前程式的目錄,所以用相對目錄的話,就找不到對應的檔案,寫入當然也是失敗了。
不容易啊,實踐出真知。
php在析構函式中的工作目錄問題
前兩天為了寫乙個日誌類,用到在析構函式中寫檔案,發現了php乙個很怪異的地方,不知道是不是bug,拿出來分享一下 如下,在析構函式的當前工作目錄竟然變為了apache目錄,害的我寫檔案寫錯地方了 更奇怪的是,我不執行write方法時,析構函式的工作目錄是正確的,也是 的執行目錄,當我執行過write...
虛析構函式與非虛析構函式問題!
class a class b public a int main 這種情況下,輸出結果我們都知道,是先執行子類的析構函式,後執行父類的析構函式,所以輸出是 b 和 a class a class b public a int main 這種情況下,我是記住了,析構函式在執行的時候,只有乙個執行,但...
虛析構函式問題
虛析構函式是為了解決這樣的乙個問題 基類的 指標指向派生類物件,並用基類的指標刪除派生類物件。如果某個類不包含 虛函式,那一般是表示它將不作為乙個基類來使用。當乙個類不準備作為基類使用時,使析構函式為虛一般是個壞主意。因為它會為類增加乙個 虛函式表,使得物件的體積翻倍,還有可能降低其可移植性。所以基...