承續一個類別的功能,建立出新的類別,稱之為類別的繼承。

這時,原來的類別稱為"超類別(superclass)""基底類別(base class)"或是"父類別"

而繼承這個基底類別,定義出的新類別稱之為"子類別(subclass)""衍生類別(derived class)"或是"擴充類別"。

繼承時要用的關鍵字extends。"class 衍生類別 extends 基底類別"。

他的公式:A類別是基底類別,而B類別是A類別的衍生類別。

//基底類別
class A類別{

}

//衍生類別
class B類別 extends A類別{

}

當然,衍生類別是可以不斷的衍生下去,到三層第四層...一直到第N層。

不過PHP有個缺點,他就是不能同時繼承多個類別。換個方式說,PHP沒有所謂的多重繼承。

雖然衍生類別裡原則上是可以使用基底類別的方法或是屬性,但是這會因為基底類別宣告時設定的存取而有差別。我用下面這個表格來表示。

基底類別的宣告 從衍生類別存取
  直接 從衍生類別定義的方法存取 
 public O
 protected X O
 private X

另外,有一點很重要,在建立衍生類別的實體時,會自動呼叫衍生類別的建構子,但是不會自動呼叫基底類別的建構子。要想要在衍生類別裡面呼叫基底類別的建構子,要這樣呈現"parent::__construct()"。解建構子也是一樣,解建構子的呼叫方法"parent::__destruct()"。

下面我就寫個範例,提供參考:

class HelloOOP{

  //php4的宣告成員屬性
  
var $memberA;
 
//php5的宣告成員屬性
  public $memberB;

  //建構子 For PHP5
  function __construct($inputA,$inputB){
      $this->memberA=$inputA;
      $this->memberB=$inputB;
  }

  //定義解建構子
  function __destruct(){
     
echo "這個類別被解開了!";
  }

  //宣告成員方法
  public function callShowMessage(){

      //呼叫成員方法來使用。
     $this->showMessage(); 

  }

   //宣告成員方法,不加上關鍵字都視為public
   function showMessage(){

        //呼叫成員屬性來使用。
        $this->memberA."<BR>";

   }

}

class Bclass extends HelloOOP{

     function __construct($clasaB_inputA,$clasaB_inputB){

          //執行基地類別的建構子
         
parent::__construct("測試","繼承");
         
$this->classB_memberA=$clasaB_inputA;
          $this->classB_memberB=$clasaB_inputB;

     }

     //宣告成員方法
     public function B(){

        //呼叫基底類別的成員方法來使用。
        $this->callShowMessage(); 

    }

}

$A=new HelloOOP("HELLO","你好");

//建立出實體之後運用裡面的方法。 會顯示 HELLO
$A->callShowMessage();

//建立出實體之後運用裡面的屬性。會顯示 "你好"
echo $A->memberB."<BR>";

$B=new Bclass("BA","BB");

//這邊他會顯示"測試"
$B->B();

//這邊他會顯示"繼承"
echo $B->memberB."<BR>";

arrow
arrow
    全站熱搜

    阿基 發表在 痞客邦 留言(2) 人氣()