close

可以使用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則分別是經理俏員工和助理性質的員工。

arrow
arrow
    文章標籤
    PHP
    全站熱搜
    創作者介紹
    創作者 mingyilai 的頭像
    mingyilai

    mingyilai的部落格

    mingyilai 發表在 痞客邦 留言(0) 人氣()