構造方法和析構方法是一種特殊的方法。構造方法,類被實例化時調用,用來給成員屬性賦初值,做一些準備工作;析構方法(無參數),在類的實例脫
離其作用域被銷燬時調用(自動調用),做一些諸如釋放內存等善後工作。
構造方法的語法格式爲;
function __construct(){
//方法實現細節
}
因爲構造方法是在類被實例化時調用的,因此並不是由實例化的類名加操作符->的形式調用,而是按照如下的語法格式調用:
變量名 = new 類名([構造方法的參數])
注意:如果類中沒有構造方法,PHP引擎會自動添加一個構造方法,其參數列表爲空,方法內容爲空
析構方法在類的實例被銷燬時自動調用,且無方法參數,格式如下;
function __destruct(){
//方法實現細節
}
注意:如果類中沒有定義析構函數,PHP引擎會自動添加一個析構方法,其方法內容爲空
兩者結合用法如下;
<?php
class Cat{
function __construct(){
echo '一個絕世的貓誕生了';
}
function __destruct(){
echo '來也匆匆,去也匆匆';
}
}
$c = new Cat();//實例化類,調用無參數的構造方法
//$c被銷燬時自動調用析構方法
?>
運行結果如下:
一個絕世的貓誕生了
來也匆匆,去也匆匆
關於構造方法和析構方法,這裏還有幾點補充說明:
<1>如果子類中沒有定義構造方法,則子類在實例化時會默認去 調用父類的構造方法。對於析構方法同樣如此,如果子類中沒有定義析構方法,則子類的實
例被銷燬時會默認調用父類的析構方法
<2>如果子類中定義了構造方法,則子類在實例化不會自動去調用父類的構造方法。對於析構方法同樣如此,如果子類中定義了析構方法,則子類的實例化被
銷燬的時候不會自動去調用父類的析構方法。
爲了在子類中調用父類的構造方法和析構方法,必須按如下語法格式顯示調用;
(1)顯示調用父類的構造方法
function __construct([子類的構造方法的參數]){ //定義子類的構造方法
…………
parent::__construct([父類的構造方法的參數]); //顯示調用父類的構造方法
…………
}
(2)顯示調用父類的析構方法
function __destruct(){ //定義子類的析構方法
…………
parent::__destruct([父類的構造方法的參數]); //顯示調用父類的析構方法
…………
}
用法如下所示:
/**
* 父類
*/
class Parent{
public $name; //共有屬性
private $age; //私有屬性
function __construct($name,$age){ //父類的構造方法
$this->name = $name;
$this->age = $age;
}
public function introduceMyself(){ //共有方法
echo '本府'.$this->name.'年方'.$this->age;
}
function __destruct(){ //父類的析構方法
echo “來也匆匆,去也匆匆”;
}
}
/**
* 子類
*/
class Student extends Parent{
public $school; //共有屬性
function __construct($name,$age,$school){ //父類的構造方法
parent::__construct($name,$age); //顯示調用父類的構造方法
$this->school= $school;
}
public function getSchool(){ //共有方法
echo '俺來自大名鼎鼎的'.$this->school;
}
function __destruct(){ //子類的析構方法
echo “終於可以不用上學了”;
parent::__destruct(); //顯示的調用父類的析構方法
}
}
$s = new Student('默默',19,'城管小學'); //實例化子類,調用子類的構造方法
echo ‘本府行不改名坐不改姓,’.$s->name.'是也'; //調用繼承自父類的屬性
$s->introduceMyself(); //調用繼承自父類的方法
$s->getSchool(); //調用子類方法
//$s被銷燬,調用子類的析構方法
運行結果如下:
本府行不改名坐不改姓,默默是也
本府默默,年方19
俺來自大名鼎鼎的城管小學
終於可以不用上學了來也匆匆,去也匆匆