php析構(gòu)函數(shù)的簡單使用說明
隨著面向?qū)ο缶幊痰钠毡檎归_,面向?qū)ο笳宫F(xiàn)了其中很多有趣的問題。相信很多初學(xué)者學(xué)習(xí)php面向?qū)ο髸r會接觸兩個函數(shù),構(gòu)造函數(shù)與析構(gòu)函數(shù)。構(gòu)造函數(shù)似乎用的更多,析構(gòu)函數(shù)用的較少(相對初學(xué)者有限編程經(jīng)驗(yàn)而言,筆者也是如此。)在功能上,構(gòu)造函數(shù)在創(chuàng)建對象時調(diào)用,析構(gòu)函數(shù)在對象銷毀時調(diào)用,都無需特意去調(diào)用,一頭一尾,倒也是前后照應(yīng)。
析構(gòu)函數(shù)常常處理的事務(wù)是一些資源釋放的工作,比如前面有fopen(),這里調(diào)用fclose(),前面有imagecreatefromjepg(),這里調(diào)用imagedestory(),這些都是些常見的例子,當(dāng)然不局限于此。我們大可將其當(dāng)做一個普通的會在對象銷毀或者腳本執(zhí)行完畢的時候執(zhí)行的函數(shù)。
啰嗦那么多,還是盡早提出今天的主要的問題:
<?php
class Test{
public function __destruct(){
echo "執(zhí)行析構(gòu)函數(shù)";
}
}
$test1=new Test;
$test2=$test3=$test1;
unset($test1);
echo "<hr/>";
這段腳本執(zhí)行結(jié)果是什么?
在回答這個問題之前,回看我上面標(biāo)示的幾個字。我們可以理所應(yīng)當(dāng)?shù)恼J(rèn)為在輸出分隔線前 unset($test1) ,這樣會調(diào)用析構(gòu)函數(shù),輸出文字,至于 $test2,$test3 應(yīng)該會在腳本執(zhí)行完畢調(diào)用析構(gòu)函數(shù)。也就是說,在分割線上面,會輸出一段文字,分隔線下面會輸出兩段文字。 在這個時候,大可以小驕傲一下,畢竟自己懂得什么時候調(diào)用析構(gòu)函數(shù)。但現(xiàn)實(shí)真是如此么?我們可以看一下執(zhí)行結(jié)果。

嘿,他喵的,怎么就輸出了一句啊???
其實(shí)我們忽略了一個重要的前提條件,就是對象的賦值默認(rèn)的是引用賦值。這一點(diǎn)很多人沒有注意到,希望初學(xué)者能多多注意一下。
那么既然是引用賦值,結(jié)合我們對普通變量的理解,我們很快想到,三個變量名指向同一塊存儲地址。那么既然如此的話, unset($test1) 起到的是什么作用???破壞變量指向存儲地址還是破壞存儲地址存儲的內(nèi)容?
了解unset()函數(shù)用法的請直覺跳過本段。
想著這蛋疼的問題,莫不如去查看手冊。
同樣是傳遞引用,毀掉的僅僅是變量名指向存儲地址。結(jié)合平常unset()的作用,我們可以這么描述,當(dāng)多個變量名或者對象名指向一塊存儲地址時,unset()函數(shù)的作用僅僅是銷毀變量名和存儲地址的指向而已,當(dāng)僅有一個變量名或者對象名,unset銷毀的是指定的存儲地址上的內(nèi)容。
我們可以想象真實(shí)的存儲內(nèi)容是一臺電視。多個人(多個變量名或?qū)ο竺┰诳匆慌_電視。unset()后,一個人不看了,離開了,電視還開著。當(dāng)只有一個人看電視的時候,unset()后,人離開的時候,要把電視關(guān)了 ,也就是釋放占用的存儲空間。對這部分內(nèi)容感興趣的話也可以看一下《php 遞歸函數(shù)的三種實(shí)現(xiàn)方式》。

好的,回歸主題。 unset($test1) 后, 原來的對象還在。當(dāng)輸出分割線后,腳本執(zhí)行完畢,調(diào)用析構(gòu)函數(shù)。 因?yàn)閷ο笾挥幸粋€,調(diào)用析構(gòu)函數(shù)也只調(diào)用一次。輸出如上結(jié)果也就理所應(yīng)當(dāng)。
其他幾個相關(guān)的有意思的問題:在程序中調(diào)用析構(gòu)函數(shù)的方法還有很多。無論是設(shè)置對象為null,還是false,其余的對象依舊不受影響。這和普通變量還是有區(qū)別的。(unset()函數(shù)的效果是一樣的)。有興趣的話可以試試。
另外說一個比較囧的事情:我們都知道構(gòu)造函數(shù)可以使用__construct(),卻忽視了同名構(gòu)造函數(shù)。所以,大家還是留心一下。
最后我們來看個例子
<?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析構(gòu)函數(shù)的具體使用方法,希望對大家有所幫助。
- php面向?qū)ο笕ヂ?(四)構(gòu)造方法與析構(gòu)方法
- php學(xué)習(xí)筆記 面向?qū)ο蟮臉?gòu)造與析構(gòu)方法
- PHP的構(gòu)造方法,析構(gòu)方法和this關(guān)鍵字詳細(xì)介紹
- 析構(gòu)函數(shù)與php的垃圾回收機(jī)制詳解
- php析構(gòu)函數(shù)的具體用法小結(jié)
- php初始化對象和析構(gòu)函數(shù)的簡單實(shí)例
- PHP中構(gòu)造函數(shù)和析構(gòu)函數(shù)解析
- php實(shí)現(xiàn)parent調(diào)用父類的構(gòu)造方法與被覆寫的方法
- PHP類的聲明與實(shí)例化及構(gòu)造方法與析構(gòu)方法詳解
- php構(gòu)造方法中析構(gòu)方法在繼承中的表現(xiàn)
相關(guān)文章
在php中實(shí)現(xiàn)限流ip次數(shù)以及允許部分ip訪問的代碼示例
這篇文章給大家介紹了如何在php中實(shí)現(xiàn)限流ip次數(shù)以及允許部分ip訪問,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)具有一定的參考價值,需要的朋友可以參考下2023-12-12
iis6手工創(chuàng)建網(wǎng)站后無法運(yùn)行php腳本的解決方法
下面小編就為大家?guī)硪黄猧is6手工創(chuàng)建網(wǎng)站后無法運(yùn)行php腳本的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
PHP單例模式模擬Java Bean實(shí)現(xiàn)方法示例
這篇文章主要介紹了PHP單例模式模擬Java Bean實(shí)現(xiàn)方法,涉及php面向?qū)ο蟪绦蛟O(shè)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
PHP基于ICU擴(kuò)展intl快速實(shí)現(xiàn)漢字轉(zhuǎn)拼音及按拼音首字母分組排序的方法
這篇文章主要介紹了PHP基于ICU擴(kuò)展intl快速實(shí)現(xiàn)漢字轉(zhuǎn)拼音及按拼音首字母分組排序的方法,結(jié)合實(shí)例形式分析了ICU擴(kuò)展intl的實(shí)現(xiàn)方法與拼音轉(zhuǎn)換、排序等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
解析:php調(diào)用MsSQL存儲過程使用內(nèi)置RETVAL獲取過程中的return值
本篇文章是對php調(diào)用MsSQL存儲過程使用內(nèi)置RETVAL獲取過程中的return值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
解決php的“It is not safe to rely on the system’s timezone setti
這篇文章主要介紹了解決php的“It is not safe to rely on the system’s timezone settings”問題的方法,需要的朋友可以參考下2015-10-10

