1. 程式人生 > >PHP建構函式和解構函式

PHP建構函式和解構函式

建構函式

PHP5允行開發者在一個類中定義一個方法作為建構函式。具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫parent::__construct(),如果子類沒有定義建構函式則會如同一個普通的類方法一樣從父類繼承。

當子類建構函式被父類具有不同引數的建構函式覆蓋時,不會產生E_STRICT錯誤資訊。為了保證相容性,在PHP5中如果找不到__construct函式並且也沒有從父類繼承,就會尋找舊式的建構函式(與類同名的函式)。如果__construct函式不存在但存在舊式的建構函式,且基類__construct函式也存在,則總是呼叫舊式的建構函式。如果舊式建構函式和__construct函式都存在,則總是呼叫__construct函式。

<?php
class BaseClass{
    function __construct($arg1){
         echo "base construct \$arg1:$arg1\n";
    }
}
class SubClass extends BaseClass{
    function __construct(){
        parent::__construct("sub");
        echo "sub construct\n";
    }
    
}
class otherSub extends BaseClass{
    function otherSub(){
         echo "otherClass\n";
    }
    // function __construct($arg1){
    //      echo "other construct \$arg1:$arg1\n";
    // }
}
class OldClass{
    function OldClass($arg){
         echo "oldClass\n";
    }
    function __construct(){
        echo "old construct\n";
    }
}

$base=new BaseClass("base");
$sub=new SubClass();
$other=new otherSub("other");
$old=new oldClass("a");
?>

自PHP5.3.3起,在名稱空間中與類名同名的方法不再作為建構函式,但不影響不在名稱空間中的類。此時如果__construct函式不存在但存在舊式的建構函式,且基類__construct函式也存在,則會呼叫基類的__construct函式。 

<?php
namespace t{
    class BaseClass{
        function __construct($arg1){
             echo "base construct \$arg1:$arg1\n";
        }
    }
    class otherSub extends BaseClass{
        function otherSub(){
             echo "otherClass\n";
        }
        // function __construct($arg1){
        //      echo "other construct \$arg1:$arg1\n";
        // }
    }
    
    $base=new BaseClass("base");
    $other=new otherSub("other");
}
?>

解構函式

PHP5引入了解構函式的概念,這類似於其它面向物件的語言,如 C++。解構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷燬時執行。要執行父類的解構函式,必須在子類的解構函式體中顯式呼叫 parent::__destruct()。和建構函式一樣,子類如果自己沒有定義解構函式則會繼承父類的。解構函式即使在使用exit()終止指令碼執行時也會被呼叫。在解構函式中呼叫exit()將會中止其餘關閉操作的執行。試圖在解構函式(在指令碼終止時被呼叫)中丟擲一個異常會導致致命錯誤。

<?php
class BaseClass{
    function __destruct(){
         echo "base destruct\n";
    }
}
class SubClass extends BaseClass{
    function __destruct(){
        parent::__destruct("sub");
        echo "sub destruct\n";
    }
    
}
class otherSub extends BaseClass{
   
}
$base=new BaseClass();
$sub=new SubClass();
$other=new otherSub();
?>

相關推薦

PHP 建構函式和解函式

<?php class test{ // 建構函式:每次建立物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作 public function __construct(){ print_r("construct\n"); }

PHP建構函式和解函式

建構函式 PHP5允行開發者在一個類中定義一個方法作為建構函式。具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫parent

php建構函式和解函式

php5 可以在類中使用__construct()定義一個建構函式  具有建構函式的類  會在每次物件建立的時候 呼叫該函式  因此常用來物件建立的時候進行一些初始化工作。 class Car{ function __construct(0{ print "建構函式被呼叫

PHP類與物件,建構函式和解函式,加上this繫結詳解

一、類與物件 不僅在PHP中,在所有面向物件程式設計語言中,類都是抽象的,物件是類的一個例項。所有抽象就是:”抽取出相像的”。 在生活中,人是一個類,抽出相像的是:人都有五官,頭髮,手腳,會吃

派生類的建構函式和解函式和多繼承中的二義性與虛擬函式

解構函式主要作用是對資料成員初始化。 1派生類的建構函式 派生類的建構函式定義的一般形式為: 派生類名::派生類名(基類所需形參,本類成員所需形參):基類1(基類1 引數表),基類2(基類2 引數表),···,基類n(基類n 引數表),物件成員1(物件1 引數表),物件成員2(物件2 引

C++學習--建構函式和解函式

建構函式是對物件進行初始化的成員函式,建構函式的名字和類的名字是一樣的,建構函式不用特定的呼叫,是在類例項化中,自動呼叫。建構函式可以有多個,也就是可以進行建構函式過載,例項化過程中會根據建構函式的引數型別、個數進行呼叫。解構函式和建構函式相反,是完成一些清理工作,比如釋放記憶體或者其他的工作。解構

C++建構函式和解函式什麼情況下會用

解構函式: 1. 物件生命週期結束,被銷燬時; 2. delete 指向物件的指標時; 3. delete 指向基類物件的指標時,其解構函式是虛擬函式; 4. 在巢狀關係中,物件A是物件B的成員,當物件B執行解構函式時,物件A的解構函式也會被呼叫; 建構函式: 1.  在宣告一個普通物件

派生類的建構函式和解函式(C++學習筆記 32)

  引入繼承的目的:①派生類繼承了基類的成員,實現了原有程式碼的重用。②實現程式碼的擴充,只有在派生類中通過新增新的成員,加入新的功能,類的派生才有實際意義。   基類的建構函式和解構函式不能被繼承,在派生類中,如果對派生類新增的成員進行初始化,就需要加入派生類的建構函式,同時,對所有從基類

提高C++效能的程式設計技術筆記:建構函式和解函式+測試程式碼

物件的建立和銷燬往往會造成效能的損失。在繼承層次中,物件的建立將引起其先輩的建立。物件的銷燬也是如此。其次,物件相關的開銷與物件本身的派生鏈的長度和複雜性相關。所建立的物件(以及其後銷燬的物件)的數量與派生的複雜度成正比。 並不是說繼承根本上就是程式碼效能的絆腳石。我們必須區分全部計算開銷、

C++中的建構函式和解函式

1:建構函式 處理物件的初始化。特殊的成員函式,不需要使用者來呼叫,而是在建立物件的時候自動執行。 特點: ①與類名相同 ②沒有任何返回型別 ③定義時可以有引數,可以無引數 2:解構函式 語法 :~cl

C++中 建構函式和解函式能不能被顯示呼叫

                程式碼: view plaincopy to clipboardprint?#include <iostream>   using namespace std;     class A   {   public:       A()       {         

建立不同型別物件時,建構函式和解函式的呼叫順序

標頭檔案 #ifndef CONS_DES_H #define CONS_DES_H #include<iostream> class base { public: base(int); ~base(); private: int data; }; #endif

建立全域性和區域性物件時,不同的建構函式和解函式的呼叫順序

#include<iostream> using namespace std; void create(); class base{ int data; public: base(int i) { data=i; cout<<"CONS:"<&l

C++進階--建構函式和解函式中的虛擬函式

//############################################################################ /* 任何時候都不要在建構函式或解構函式中呼叫虛擬函式 */ class dog { public: string m_name

C++建構函式和解函式--從常見的面試題說起系列1

class A { public:     A(){a=0}     virtual ~A(){printf "aaa";}} private:     int a; } class B: public A { public:     B(){a=2

C#—建構函式和解函式

一、前言        作為比C更先進的語言,C#提供了更好的機制來增強程式的安全性,C#編譯器具有嚴格的型別安全檢查功能,它幾乎能找出程式中所有的語法問題,但是程式通過了編譯檢查並不表示錯誤已經不存在了,不少難以察覺的程式錯誤是由於變數沒有被正確初始化或清除造成的,而初

建構函式和解函式的作用是什麼?什麼時候需要自己定義建構函式和解函式

建構函式的作用:用於新建物件的初始化工作。 解構函式的作用:用於在撤銷物件前,完成一些清理工作,比如:釋放記憶體等。 每當建立物件時,需要新增初始化程式碼時,則需要定義自己的建構函式;而物件撤銷時,需

C++ 建構函式和解函式與virtual關鍵字

一、建構函式 1.建構函式任何時候都不可以宣告為虛擬函式,原因如下:1)虛擬函式的呼叫軍需通過虛擬函式表vtable來呼叫,虛擬函式表是儲存在記憶體空間的,在呼叫建構函式前,物件還未被實力化,也就沒有

C++知識點10:建構函式和解函式

建構函式: 生成物件時呼叫建構函式 生成派生類物件時先呼叫基類建構函式在呼叫派生類建構函式 #include <iostream> using namespace std; class base { public: base(){

C++中建構函式和解函式丟擲異常問題

一. 丟擲異常 1.1 丟擲異常(也稱為拋棄異常)即檢測是否產生異常,在C++中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。 該語句的格式為: throw 表示式; 如果在try語句塊的程式段中(包括在其中呼叫的函式)發現了異常,且拋棄了