可以使用public、private、protected這三個存取修飾字來設定成員的存取層級,以及是否能被繼承
如果在定義時省略了存取修飾字或使用var關鍵字則表示為public
- public:可以被任何程式碼存取,包括被繼承。
- private:只能被包含其定義的類別存取,不能被繼承
- protected:只能被包含其定義的類別或其子類別存取,包括被繼承
<?php
class ParentClass //定義父類別
{
public $Field1; //定義public屬性 (能夠被繼承)
private $Field2; //定義private屬性 (不能被繼承)
protected $Field3; //定義protected屬性 (能夠被繼承)
public function Method1(){} //定義public方法 (能夠被繼承)
private function Method2(){} //定義private方法 (不能被繼承)
protected function Method3(){} //定義protected方法 (能夠被繼承)
}
class ChildClass extends ParentClass //定義子類別
{
public $Field4; //定義public屬性 (能夠被繼承)
private $Field5; //定義private屬性 (不能被繼承)
protected $Field6; //定義protected屬性 (能夠被繼承)
public function Method4(){} //定義public方法 (能夠被繼承)
private function Method5(){} //定義private方法 (不能被繼承)
protected function Method6(){} //定義protected方法 (能夠被繼承)
}
?>
ParentClass類別外的程式碼和ChildClass類別外的程式碼只能存取public成員,如果存取了其它成員,就會產生錯誤訊息,
例如ChildClass::Method2();將會產生類似"Fatal error: Call to private method ParentClass::method2() from context"的錯誤訊息
父類別內定義為private的成員只能被父類別內的程式碼存取,其它在父類別外的程式碼(包括子類別)均不得存取,對於安全性較高、不允許父類別外的程式碼存取的成員就必須定義為private;相反的,父類別內定義為protected的成員則能夠被父類別及其子類別內的程式碼存取,所以在使用繼承的同時,您必須考慮清楚是否允許使用者透繼承的方式存取某些成員,是的話才要將這些成員定義為protected。
protected賦予了子類別存取某些成員的彈性,同時也適度保護了這些成員,畢竟子類別外的程式碼無法加以存取,但這中間其實還是存在著潛的危險,因為有心人士可能會藉由繼承的方式隨意竄改父類別的protected成員,影響程式的運作,所以在定義父類別的成員存取層級時應該要仔細思考。
父類別和子類別構成了「類別階層」(class hierarchy),類別階層的實作相當簡單,重點在於如何設計類別階層,類別階層由上到下的定義應該是由廣義進入狹義,比方說父類別泛指公司員工,子類別的Managers和Asistants則分別是經理俏員工和助理性質的員工。
留言列表