php 物件導向(四)
承續一個類別的功能,建立出新的類別,稱之為類別的繼承。
這時,原來的類別稱為"超類別(superclass)""基底類別(base class)"或是"父類別"
而繼承這個基底類別,定義出的新類別稱之為"子類別(subclass)""衍生類別(derived class)"或是"擴充類別"。
繼承時要用的關鍵字extends。"class 衍生類別 extends 基底類別"。
他的公式:A類別是基底類別,而B類別是A類別的衍生類別。
//基底類別
class A類別
{
}
//衍生類別
class B類別 extends A類別
{
}
當然,衍生類別是可以不斷的衍生下去,到三層第四層...一直到第N層。
不過PHP有個缺點,他就是不能同時繼承多個類別。換個方式說,PHP沒有所謂的多重繼承。
雖然衍生類別裡原則上是可以使用基底類別的方法或是屬性,但是這會因為基底類別宣告時設定的存取而有差別。我用下面這個表格來表示。
另外,有一點很重要,在建立衍生類別的實體時,會自動呼叫衍生類別的建構子,但是不會自動呼叫基底類別的建構子。要想要在衍生類別裡面呼叫基底類別的建構子,要這樣呈現"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>";
這時,原來的類別稱為"超類別(superclass)""基底類別(base class)"或是"父類別"
而繼承這個基底類別,定義出的新類別稱之為"子類別(subclass)""衍生類別(derived class)"或是"擴充類別"。
繼承時要用的關鍵字extends。"class 衍生類別 extends 基底類別"。
他的公式:A類別是基底類別,而B類別是A類別的衍生類別。
//基底類別
class A類別
{
}
//衍生類別
class B類別 extends A類別
{
}
當然,衍生類別是可以不斷的衍生下去,到三層第四層...一直到第N層。
不過PHP有個缺點,他就是不能同時繼承多個類別。換個方式說,PHP沒有所謂的多重繼承。
雖然衍生類別裡原則上是可以使用基底類別的方法或是屬性,但是這會因為基底類別宣告時設定的存取而有差別。我用下面這個表格來表示。
基底類別的宣告 | 從衍生類別存取 | |
直接 | 從衍生類別定義的方法存取 | |
public | O | O |
protected | X | O |
private | X | 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>";
留言
張貼留言