您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)PHP中構(gòu)造方法和析構(gòu)方法有什么區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。
1.構(gòu)造方法
在每個(gè)聲明的類中都有一個(gè)唄稱為構(gòu)造方法的特殊成員方法,如果沒有顯式的聲明它,類中都會(huì)默認(rèn)存在一個(gè)沒有參數(shù)列表并且內(nèi)容為空的構(gòu)造方法。如果顯式的聲明它,則類中的默認(rèn)構(gòu)造方法將不會(huì)存在。當(dāng)創(chuàng)建一個(gè)對象時(shí),構(gòu)造方法就會(huì)被自動(dòng)調(diào)用一次,即每次使用關(guān)鍵詞new來實(shí)例化對象時(shí)都會(huì)自動(dòng)調(diào)用構(gòu)造方法,不能主動(dòng)通過對象的引用調(diào)用構(gòu)造方法。所以通常使用構(gòu)造方法來執(zhí)行一些有用的初始化任務(wù),比如對成員屬性在創(chuàng)建對象時(shí)賦初值等。
在PHP5以前的版本中,構(gòu)造方法的方法名稱必須與類名相同,這種方式在PHP 5中任然可以使用。但在PHP中很少聲明和類名同名的構(gòu)造方法了,這樣做的好處是可以使構(gòu)造函數(shù)獨(dú)立于類名,當(dāng)類名發(fā)生變化時(shí)不需要更改相應(yīng)的構(gòu)造函數(shù)名稱。為了向下兼容,在創(chuàng)建對象時(shí),如果一個(gè)類中沒有名為__construct()
的構(gòu)造方法,PHP將搜索與類名相同名的構(gòu)造方法執(zhí)行。在類中聲明構(gòu)造方法的格式如下:
function __construct( [參數(shù)列表] ){ //構(gòu)造方法名稱是以兩個(gè)下劃線開始的 //方法體,通常用來對成員屬性進(jìn)行初始化賦值 }
在PHP中,同一個(gè)類中只能聲明一個(gè)構(gòu)造方法。原因是構(gòu)造方法名稱是固定的,在PHP中不能聲明同名的兩個(gè)函數(shù),所以也就沒有構(gòu)造方法重載。但可以在聲明構(gòu)造方法時(shí)使用默認(rèn)參數(shù),實(shí)現(xiàn)其他面向?qū)ο蟮木幊陶Z言中構(gòu)造方法重載的功能。這樣在創(chuàng)建對象時(shí),如果在構(gòu)造方法中沒有傳入?yún)?shù),則使用默認(rèn)參數(shù)為成員屬性進(jìn)行初始化。
構(gòu)造函數(shù)可以接受參數(shù),能夠在創(chuàng)建對象時(shí)賦值給對象屬性
構(gòu)造函數(shù)可以調(diào)用類方法或其他函數(shù)
構(gòu)造函數(shù)可以調(diào)用其他類的構(gòu)造函數(shù)
構(gòu)造函數(shù)使用例子:
<?php class Person{ private $name; private $age; private $gender; public function __construct($name,$age,$gender){ $this->setName($name); //調(diào)用類方法 $this->age = $age; $this->setGender($gender); } public function setName($name){ $this->name = $name; } // ... setter 方法 } $person = new Person("yeoman",23,'男'); ?>
調(diào)用父類構(gòu)造函數(shù)、調(diào)用無關(guān)類的構(gòu)造函數(shù):
function __construct(){ parent::__construct(); // 調(diào)用父類的構(gòu)造函數(shù)必須顯示的使用parent調(diào)用父類構(gòu)造函數(shù) classname::__construct(); // 調(diào)用其他類的構(gòu)造函數(shù),classname是類名 //其他操作 }
繼承和構(gòu)造函數(shù)
PHP中的子類的構(gòu)造函數(shù)不會(huì)主動(dòng)調(diào)用父類的構(gòu)造函數(shù),要顯示的使用parent::__construct()
調(diào)用:
<?php class Animal{ private $name; function __construct($name){ $this->setName($name) echo "動(dòng)物類被創(chuàng)建!"; } // ... 其他方法 } class Birds extends Animal{ private $name; private $leg; function __construct($name,$leg){ parent::__construct($name); // 顯示調(diào)用 $this->setLeg($leg); echo "鳥類被創(chuàng)建!"; } // ... 其他方法 } ?>
如果涉及多層繼承,當(dāng)調(diào)用parent::__construct()
時(shí),會(huì)沿著父類向上搜索,直到找到最合適的構(gòu)造函數(shù),例如:
// 接上例 class Parrot extends Birds{ private $name; private $leg; private $wing; function __construct($name){ parent::__construct($name); // 此時(shí)沒有找到父類(Birds類)合適的構(gòu)造函數(shù),只能向上搜索,搜索到Animal類時(shí),才找到合適的構(gòu)造函數(shù) echo "鸚鵡類被創(chuàng)建!"; $this->smackTalk(); /* 輸出結(jié)果: "動(dòng)物類被創(chuàng)建!" "鸚鵡說話!" */ } function smackTalk(){ echo "鸚鵡說話!"; } }
如果想要依次調(diào)用幾個(gè)父類的構(gòu)造函數(shù),可以使用類名直接調(diào)用構(gòu)造函數(shù),例如:
function __construct($name,$leg){ Animal::__construct($name); // 調(diào)用Animal構(gòu)造函數(shù) Birds::__construct($name,$leg); // 調(diào)用Birds構(gòu)造函數(shù) }
2.析構(gòu)函數(shù)
析構(gòu)方法允許在銷毀一個(gè)對象之前執(zhí)行一些特定的操作,例如關(guān)閉文件,釋放結(jié)果集等。
當(dāng)堆內(nèi)存段中的對象失去訪問它的引用時(shí),它就不能被訪問了,也就成為垃圾對象了。通常對象的引用被賦予其他的值或者是在頁面運(yùn)行結(jié)束時(shí),對象都會(huì)失去引用。
析構(gòu)函數(shù)是在銷毀對象時(shí),自動(dòng)調(diào)用的,不能顯式的調(diào)用。析構(gòu)函數(shù)不能帶參數(shù)。
析構(gòu)方法的聲明格式如下:
function __deconstruct(){ //方法體,通常用來完成一些在對象銷毀前的清理任務(wù) }
在以下幾種情況下可能會(huì)調(diào)用析構(gòu)函數(shù)(但不一定):
PHP頁面加載完畢之后;
unset()類;
變量引用指向別的對象或值時(shí);
PHP的內(nèi)存回收機(jī)制和JAVA的很類似,對沒有任何引用的對象進(jìn)行銷毀回收,采用引用計(jì)數(shù)器的技術(shù)。
例子:
<?php class test{ function __destruct(){ echo "當(dāng)對象銷毀時(shí)會(huì)調(diào)用!??!"; } } $a = $b = $c = new test(); $a = null; unset($b); echo "<hr />"; ?>
此例子,如下圖,有三個(gè)變量引用$a,$b,$c指向test對象,test對象就有3個(gè)引用計(jì)數(shù),當(dāng)$a = null
時(shí),$a對test對象的引用丟失,計(jì)數(shù)-1,變?yōu)?,當(dāng)$b被unset()
時(shí),$b對test對象的引用也丟失了,計(jì)數(shù)再-1,變?yōu)?,最后頁面加載完畢,$c指向test對象的引用自動(dòng)被釋放,此時(shí)計(jì)數(shù)再-1,變?yōu)?,test對象已沒有變量引用,就會(huì)被銷毀,此時(shí)就會(huì)調(diào)用析構(gòu)函數(shù)。
在PHP中析構(gòu)方法并不是很常用,它屬于類中可選的一部分,只有需要時(shí)才在類中聲明。
<?php class Person{ var $name; var $sex; var $age; function __construct($name, $sex, $age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } function __destruct(){ echo "再見" . $this->name . "<br />"; } } $person1 = new Person("張三三", "男", 23); $person1 = null; //第一個(gè)對象將失去引用 $person2 = new Person("李四四", "女", 17); $person3 = new Person("王五五", "男", 43); ?>
運(yùn)行結(jié)果:
再見張三三
再見王五五
再見李四四
關(guān)于PHP中構(gòu)造方法和析構(gòu)方法有什么區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。