PHP物件導向-構造方法和析構方法的代碼案例分享

來源:互聯網
上載者:User
  構造方法和析構方法是對象中的兩個特殊方法,它們都與對象的生命週期有關。構造方法是 對象建立完成後第一個被對象自動調用的方法,這是我們在對象中使用構造方法的原因。而析構方法是 對象在銷毀之前最後一個被對象自動調用的方法,這也是我們在對象中使用析構方法的原因。所以通常使用構造方法完成一些對象的 初始化工作,使用析構方法完成一些對象在銷毀之前的 清理工作

1.構造方法

  在每個聲明的類中都有一個唄稱為構造方法的特殊成員方法,如果沒有顯式的聲明它,類中都會預設存在一個沒有參數列表並且內容為空白的構造方法。如果顯式的聲明它,則類中的預設構造方法將不會存在。當建立一個對象時,構造方法就會被自動調用一次,即每次使用關鍵詞new來執行個體化對象時都會自動調用構造方法,不能主動通過對象的引用調用構造方法。所以通常使用構造方法來執行一些有用的初始化任務,比如對成員屬性在建立對象時賦初值等。
  在PHP5以前的版本中,構造方法的方法名稱必須與類名相同,這種方式在PHP 5中任然可以使用。但在PHP中很少聲明和類名同名的構造方法了,這樣做的好處是可以使建構函式獨立於類名,當類名發生變化時不需要更改相應的建構函式名稱。為了向下相容,在建立對象時,如果一個類中沒有名為construct()的構造方法,PHP將搜尋與類名相同名的構造方法執行。在類中聲明構造方法的格式如下:

function construct( [參數列表] ){ //構造方法名稱是以兩個底線開始的    //方法體,通常用來對成員屬性進行初始化賦值}

  在PHP中,同一個類中只能聲明一個構造方法。原因是構造方法名稱是固定的,在PHP中不能聲明同名的兩個函數,所以也就沒有構造方法重載。但可以在聲明構造方法時使用預設參數,實現其他物件導向的程式設計語言中構造方法重載的功能。這樣在建立對象時,如果在構造方法中沒有傳入參數,則使用預設參數為成員屬性進行初始化。

  • 建構函式可以接受參數,能夠在建立對象時賦值給對象屬性

  • 建構函式可以調用類方法或其他函數

  • 建構函式可以調用其他類的建構函式
     
    建構函式使用例子:

<?phpclass Person{    private $name;        private $age;        private $gender;        public function construct($name,$age,$gender){        $this->setName($name);   //調用類方法        $this->age = $age;                $this->setGender($gender);    }    public function setName($name){        $this->name = $name;    }    // ... setter 方法}$person = new Person("yeoman",23,'男');?>

  調用父類建構函式、調用無關類的建構函式:

function construct(){    parent::construct(); // 調用父類的建構函式必須顯示的使用parent調用父類建構函式    classname::construct(); // 調用其他類的建構函式,classname是類名    //其他動作}

繼承和建構函式
  PHP中的子類的建構函式不會主動調用父類的建構函式,要顯示的使用parent::construct()調用:

<?phpclass Animal{    private $name;        function construct($name){        $this->setName($name)                echo "動物類被建立!";    }    // ... 其他方法}class Birds extends Animal{    private $name;        private $leg;        function construct($name,$leg){        parent::construct($name); // 顯示調用        $this->setLeg($leg);                echo "鳥類被建立!";    }    // ... 其他方法}?>

如果涉及多層繼承,當調用parent::construct()時,會沿著父類向上搜尋,直到找到最合適的建構函式,例如:

// 接上例class Parrot extends Birds{    private $name;        private $leg;        private $wing;        function construct($name){        parent::construct($name);         // 此時沒有找到父類(Birds類)合適的建構函式,只能向上搜尋,搜尋到Animal類時,才找到合適的建構函式        echo "鸚鵡類被建立!";                $this->smackTalk();                /*        輸出結果:        "動物類被建立!"        "鸚鵡說話!"        */    }    function smackTalk(){        echo "鸚鵡說話!";        }}

  如果想要依次調用幾個父類的建構函式,可以使用類名直接調用建構函式,例如:

function construct($name,$leg){       Animal::construct($name); // 調用Animal建構函式        Birds::construct($name,$leg); // 調用Birds建構函式}

2.解構函式

  析構方法允許在銷毀一個對象之前執行一些特定的操作,例如關閉檔案,釋放結果集等。
  當堆記憶體段中的對象失去訪問它的引用時,它就不能被訪問了,也就成為垃圾對象了。通常對象的引用被賦予其他的值或者是在頁面運行結束時,對象都會失去引用。
  解構函式是在銷毀對象時,自動調用的,不能顯式的調用。解構函式不能帶參數。

  析構方法的聲明格式如下:

function deconstruct(){    //方法體,通常用來完成一些在對象銷毀前的清理任務}

在以下幾種情況下可能會調用解構函式(但不一定):

  • PHP頁面載入完畢之後;

  • unset()類;

  • 變數引用指向別的對象或值時;

  • PHP的記憶體回收機制和JAVA的很類似,對沒有任何引用的對象進行銷毀回收,採用引用計數器的技術。

例子:

<?phpclass test{    function destruct(){        echo "當對象銷毀時會調用!!!";    }}$a = $b = $c = new test();$a = null;unset($b);echo "<hr />";?>

  此例子,如,有三個變數引用$a,$b,$c指向test對象,test對象就有3個引用計數,當$a = null時,$a對test對象的引用丟失,計數-1,變為2,當$b被unset()時,$b對test對象的引用也丟失了,計數再-1,變為1,最後頁面載入完畢,$c指向test對象的引用自動被釋放,此時計數再-1,變為0,test對象已沒有變數引用,就會被銷毀,此時就會調用解構函式。

在PHP中析構方法並不是很常用,它屬於類中可選的一部分,只有需要時才在類中聲明。

<?phpclass 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;   //第一個對象將失去引用$person2 = new Person("李四四", "女", 17);$person3 = new Person("王五五", "男", 43);?>

運行結果:

再見張三三再見王五五再見李四四

  第一個對象在聲明完成以後,它的引用就被賦予了空值,所以第一個對象最先失去的引用,不能再被訪問了,人後自動調用第一個對象中的析構方法輸出“再見張三三”。後面聲明的兩個對象都是在頁面執行結束時失去的引用,也都自動調用了析構方法。但因為對象的引用都是放在棧記憶體中的,由於棧的後進先出特點,最後建立的對象會被最先釋放,多以先自動調用第三個對象的析構方法,最後才調用第二個對象的析構方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.