PHP構造方法和析構函數


<?php

// 構造方法PHP5可以在類中使用__construct()定義一個構造函數,具有構造函數的類,會在每次對象創建的時候調用該函數,

//因此常用來在對象創建的時候進行一些初始化工作。

class Person {

    public  $name;

    public  $age;

    public  function __construct($name,$age)

    {

        

        $this->name = $name;

        $this->age = $age;

        echo $this->name."被創建!<br/>";

        

    }

    // 析構方法 析構方法指的是當某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執行的函數

    public function __destruct() 

    {

     // 釋放資源

        echo $this->name."被銷毀!<br/>";

    }

}

$people = new Person("大強",20);

echo $people->name."<br/>";

$people1 = new Person("小強",20);

 

//詳細解說:

父類的析構函數不會被引擎暗中調用。要執行父類的析構函數,必須在子類的析構函數體中顯式調用 parent::__destruct() 。此外也和構造函數一樣,子類如果自己沒有定義析構函數則會繼承父類的。 

析構函數即使在使用 exit() 終止腳本運行時也會被調用。在析構函數中調用 exit() 將會中止其余關閉操作的運行。 

Note:

析構函數在腳本關閉時調用,此時所有的 HTTP 頭信息已經發出。腳本關閉時的工作目錄有可能和在 SAPI(如 apache)中時不同。

Note:

試圖在析構函數(在腳本終止時被調用)中拋出一個異常會導致致命錯誤。

完全分析:

構造函數和析構函數,先說明一下同一個類的對象之間的不同之處:首先,對象名不相同。其次,對象的數據成員的值不相同。我們在聲明一個對象時,可以 對其初始化。如果對其初始化,那么程序會向操作系統申請為其分配一定的內存空間,在為其分配內存空間時,會將初始化寫入內存單元中。問題是,我們不能像初 始化一般變量那樣,在對其初始化時,將初始值寫入內存單元中,這是因為相對於這種初始化方法來說,類的對象太過復雜。

構造函數:我們用構造函數來初始化類的對象。C++在創建對象時,都會調用構造函數。構造函數是一種特殊的類成員函數,當然可以直接訪問類的所有數據成員;可以是內聯函數,可以有形參列表,可以有默認形參值,可以重載。

我們可以將一個變量的值,賦給同一類型的另一個變量,對於類的對象來說,也可以將一個對象的內容,拷貝給同一類的另一個對象。拷貝的方法可以是將一 個對象的數據變量的值,分別賦給另一個對象的相應數據變量。但是如果數據變量很多,這種方法就顯得有些麻煩。也可以用一種特殊的構造函數,來實現用一個已 經存在的對象來初始化另一個對象這種功能。

拷貝構造函數:一種特殊的構造函數,也是用來構造對象的,具有構造函數的所有特性。拷貝構造函數能利用一個已存在的對象初始化同一類的另一個對象。拷貝構造函數的形參是本類的對象的引用。(為什么必須是引用?)

拷貝構造函數在以下三種情況下會被調用:當用類的一個對象初始化該類的另一個對象時,系統自動調用拷貝構造函數實現對象間的拷貝賦值;當某個函數的 形參是某個類的對象時(可以是對象的引用嗎?),當調用這個函數,實參賦值給形參時,系統就自動調用拷貝構造函數;當某個函數的返回值是某個類的對象時, 調用拷貝構造函數。最后的一種情況:函數func的返回值是A,對象A是在函數func內部的局部變量,當函數func執行完之后就被釋放。調用函數 func的語句是:B=func()。對象B是這樣被對象A賦值的:當編譯器執行B=func()時,會創建一個臨時無名變量。當func函數執行 return A;語句之時,實際是調用拷貝構造函數,將對象A的值拷貝給那個臨時變量,之后釋放A占用的內存空間。之后再用拷貝構造函數,將臨時變量的值拷貝到對象B 中。

析構函數:自然萬物都有生命周期,類的對象也不例外。如果在某一個函數中聲明了一個對象,在函數執行結束,返回調用函數時,聲明的對象就會被釋放。 析構函數的作用與構造函數的相反。析構函數是在對象要被刪除時,系統自動調用的。執行完析構函數之后,對象占用的內存被釋放。如果我們希望在刪除對象時做 一些相關的清理工作,就可以把它們寫在該類的析構函數中。

PS:大強原創:詳細如有不懂請聯系:18825121252


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM