《PHP實戰:php析構函數的簡單使用說明》要點:
本文介紹了PHP實戰:php析構函數的簡單使用說明,希望對您有用。如果有疑問,可以聯系我們。
隨著面向對象編程的普遍展開,面向對象展現了其中很多有趣的問題.相信很多初學者學習php面向對象時會接觸兩個函數,構造函數與析構函數.構造函數似乎用的更多,析構函數用的較少(相對初學者有限編程經驗而言,筆者也是如此.)在功能上,構造函數在創建對象時調用,析構函數在對象銷毀時調用,都無需特意去調用,一頭一尾,倒也是前后照應.PHP實戰
析構函數常常處理的事務是一些資源釋放的工作,比如前面有fopen(),這里調用fclose(),前面有imagecreatefromjepg(),這里調用imagedestory(),這些都是些常見的例子,當然不局限于此.我們大可將其當做一個普通的會在對象銷毀或者腳本執行完畢的時候執行的函數.PHP實戰
履敲炊啵故薔≡縑岢黿裉斕鬧饕奈侍猓PHP實戰
<?php class Test{ public function __destruct(){ echo "執行析構函數"; } } $test1=new Test; $test2=$test3=$test1; unset($test1); echo "<hr/>";
這段腳本執行結果是什么?PHP實戰
在回答這個問題之前,回看我上面標示的幾個字.我們可以理所應當的認為在輸出分隔線前 unset($test1) ,這樣會調用析構函數,輸出文字,至于 $test2,$test3 應該會在腳本執行完畢調用析構函數.也就是說,在分割線上面,會輸出一段文字,分隔線下面會輸出兩段文字. 在這個時候,大可以小驕傲一下,畢竟自己懂得什么時候調用析構函數.但現實真是如此么?我們可以看一下執行結果.PHP實戰
PHP實戰
嘿,他喵的,怎么就輸出了一句啊???PHP實戰
其實我們忽略了一個重要的前提條件,就是對象的賦值默認的是引用賦值.這一點很多人沒有注意到,希望初學者能多多注意一下.PHP實戰
那么既然是引用賦值,結合我們對普通變量的理解,我們很快想到,三個變量名指向同一塊存儲地址.那么既然如此的話, unset($test1) 起到的是什么作用???破壞變量指向存儲地址還是破壞存儲地址存儲的內容?PHP實戰
了解unset()函數用法的請直覺跳過本段.PHP實戰
想著這蛋疼的問題,莫不如去查看手冊.PHP實戰
同樣是傳遞引用,毀掉的僅僅是變量名指向存儲地址.結合平常unset()的作用,我們可以這么描述,當多個變量名或者對象名指向一塊存儲地址時,unset()函數的作用僅僅是銷毀變量名和存儲地址的指向罷了,當僅有一個變量名或者對象名,unset銷毀的是指定的存儲地址上的內容.PHP實戰
我們可以想象真實的存儲內容是一臺電視.多個人(多個變量名或對象名)在看一臺電視.unset()后,一個人不看了,離開了,電視還開著.當只有一個人看電視的時候,unset()后,人離開的時候,要把電視關了 ,也就是釋放占用的存儲空間.對這部分內容感興趣的話也可以看一下《php 遞歸函數的三種實現方式》.PHP實戰
PHP實戰
好的,回歸主題. unset($test1) 后, 原來的對象還在.當輸出分割線后,腳本執行完畢,調用析構函數. 因為對象只有一個,調用析構函數也只調用一次.輸出如上結果也就理所應當.PHP實戰
其他幾個相關的有意思的問題:在程序中調用析構函數的辦法還有很多.無論是設置對象為null,還是false,其余的對象依舊不受影響.這和普通變量還是有區別的.(unset()函數的效果是一樣的).有興趣的話可以試試.PHP實戰
另外說一個比較宓氖慮椋何頤嵌賈攔乖旌梢允褂__construct(),卻忽視了同名構造函數.所以,大家還是留心一下.PHP實戰
最后我們來看個例子PHP實戰
<?php /* * Created on 2009-11-18 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ class student{ //屬性 private $no; private $name; private $gender; private $age; private static $count=0; function __construct($pname) { $this->name = $pname; self::$count++; } function __destruct() { self::$count--; } static function get_count() { return self::$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()); ?>
上面這段代碼就是PHP5析構函數的具體使用辦法,希望對大家有所幫助.PHP實戰
維易PHP培訓學院每天發布《PHP實戰:php析構函數的簡單使用說明》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8776.html