與建構函式相反,在php5中,可以定義乙個名為__destruct()的函式,稱之為php5析構函式,php將在物件在記憶體中被銷毀前呼叫析構函式,使物件在徹底消失之前完成一些工作。物件在銷毀一般可以通過賦值為null實現。
隨著物件導向程式設計的普遍展開,物件導向展現了其中很多有趣的問題。相信很多初學者學習php物件導向時會接觸兩個函式,建構函式與析構函式。建構函式似乎用的更多,析構函式用的較少(相對初學者有限程式設計經驗而言,筆者也是如此。)在功能上,建構函式在建立物件時呼叫,析構函式在物件銷毀時呼叫,都無需特意去呼叫,一頭一尾,倒也是前後照應。
析構函式常常處理的事務是一些資源釋放的工作,比如前面有fopen(),這裡呼叫fclose(),前面有imagecreatefromjepg(),這裡呼叫imagedestory(),這些都是些常見的例子,當然不侷限於此。我們大可將其當做乙個普通的會在物件銷毀或者指令碼執行完畢的時候執行的函式。
囉嗦那麼多,還是盡早提出今天的主要的問題:
<?php
class test
}$test1=new test;
$test2=$test3=$test1;
unset($test1);
echo "";
這段指令碼執行結果是什麼?
在回答這個問題之前,回看我上面標示的幾個字。我們可以理所應當的認為在輸出分隔線前 unset($test1) ,這樣會呼叫析構函式,輸出文字,至於 $test2,$test3 應該會在指令碼執行完畢呼叫析構函式。也就是說,在分割線上面,會輸出一段文字,分隔線下面會輸出兩段文字。 在這個時候,大可以小驕傲一下,畢竟自己懂得什麼時候呼叫析構函式。但現實真是如此麼?我們可以看一下執行結果。
嘿,他喵的,怎麼就輸出了一句啊???
其實我們忽略了乙個重要的前提條件,就是物件的賦值預設的是引用賦值。這一點很多人沒有注意到,希望初學者能多多注意一下。
那麼既然是引用賦值,結合我們對普通變數的理解,我們很快想到,三個變數名指向同一塊儲存位址。那麼既然如此的話, unset($test1) 起到的是什麼作用???破壞變數指向儲存位址還是破壞儲存位址儲存的內容?
了解unset()函式用法的請直覺跳過本段。
想著這蛋疼的問題,莫不如去檢視手冊。
同樣是傳遞引用,毀掉的僅僅是變數名指向儲存位址。結合平常unset()的作用,我們可以這麼描述,當多個變數名或者物件名指向一塊儲存位址時,unset()函式的作用僅僅是銷毀變數名和儲存位址的指向而已,當僅有乙個變數名或者物件名,unset銷毀的是指定的儲存位址上的內容。
我們可以想象真實的儲存內容是一台電視。多個人(多個變數名或物件名)在看一台電視。unset()後,乙個人不看了,離開了,電視還開著。當只有乙個人看電視的時候,unset()後,人離開的時候,要把電視關了 ,也就是釋放占用的儲存空間。對這部分內容感興趣的話也可以看一下《php 遞迴函式的三種實現方式》。
好的,回歸主題。 unset($test1) 後, 原來的物件還在。當輸出分割線後,指令碼執行完畢,呼叫析構函式。 因為物件只有乙個,呼叫析構函式也只呼叫一次。輸出如上結果也就理所應當。
其他幾個相關的有意思的問題:在程式中呼叫析構函式的方法還有很多。無論是設定物件為null,還是false,其餘的物件依舊不受影響。這和普通變數還是有區別的。(unset()函式的效果是一樣的)。有興趣的話可以試試。
最後我們來看個例子
<?php
/** created on 2009-11-18
** to change the template for this generated file go to
* window - preferences - phpeclipse - php - code templates
*/class student
function __destruct()
static function get_count()
}$s1=new student("tom");
print(student::get_count());
$s2=new student("jerry");
print(student::get_count());
$s1=null;
print(student::get_count());
$s2=null;
print(student::get_count());
?>
php析構函式使用,php析構方法怎麼用
php 5 引入了析構函式的概念,這類似於其它物件導向的語言,如 c 析構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷毀時執行。析構函式示例 class mydestructableclass function construct print in constructor n this n...
建構函式和析構函式的簡單說明
使用構造方法 函式 的好處 建構函式可以過載,可以有引數,與類同名,沒有返回值 不用寫void 1 對多個屬性進行賦值時,不需要重複的寫例項名 在例項化 初始化 的時候直接賦值 2 可以保證使用者在new乙個物件的時候必須對某乙個屬性進行賦值 3 在建立物件時,對唯讀屬性進行初始化 析構函式 在程式...
PHP函式使用說明 補充
php函式使用說明,應用舉例,精簡點評,希望對您學習php有所幫助。1.print r 列印關於www.cppcns.com變數的易於理解的資訊,若為陣列,則顯示陣列的結構資訊.例如 複製 如下 a array a apple b banana c array x y z print r a axg...