析構函式中的工作目錄問題

2021-06-06 22:26:00 字數 1984 閱讀 6217

析構函式大家想必都非常熟悉了

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 這種情況下,我是記住了,析構函式在執行的時候,只有乙個執行,但...

虛析構函式問題

虛析構函式是為了解決這樣的乙個問題 基類的 指標指向派生類物件,並用基類的指標刪除派生類物件。如果某個類不包含 虛函式,那一般是表示它將不作為乙個基類來使用。當乙個類不準備作為基類使用時,使析構函式為虛一般是個壞主意。因為它會為類增加乙個 虛函式表,使得物件的體積翻倍,還有可能降低其可移植性。所以基...