PHP中的封裝和繼承

 

1. 封裝

 

1.1什麼是封裝?

經過訪問修飾符,將類中的屬性和方法進行私有化處理,並提供惟一的設置和讀取的函數

set/get方法,以實現訪問控制。這個過程稱爲封裝。this

注意:是實現訪問控制,而不是拒絕訪問。也就是說,單純的私有化屬性並非封裝,必須提供對應的set/get方法,控制用戶使用咱們提供的方法進行操做。spa

 

1.2封裝有什麼做用?

① 使用者只須要關心類可以提供哪些功能,而不須要關心這些功能的實現細節。(方法的封裝)code

② 對用戶的數據進行控制,防止設置不合法的數據,並控制返回給用戶的數據。(屬性的封裝)orm

 

1.3如何實現封裝?

① 方法的封裝對象

     對於一些只須要在類內部使用,而不須要對外提供功能的函數,咱們可使用private關鍵字進行私有化處理。blog

          private function formaName(){}
          function showName(){
              $this->formaName();// 私有化的方法,只能在類內部使用$this調用
          }

 

② 屬性的封裝 + set/get方法繼承

          private $age;
          function setAge($age){
              $this->age = $age;
          }
          function getAge(){
              return $this->age;
          }
 使用屬性:$對象名->setAge(27);
          echo $對象名->getAge();
 

③ 屬性的封裝 + 魔術方法get

          private $age;
          function __set($key,&value){
             $this->$key = $value;
          }
          function __get($key){
              return $this->$key;
          }
  使用屬性:$對象名->age=12; // 設置私有屬性時,將自動調用__set()
          $對象名->age; // 讀取私有屬性時,將自動調用__get()

 

1.4封裝中經常使用的魔術方法

 

__set($key,$value):設置類中非公開屬性時,將自動調用魔術方法。而且傳遞兩個參數,$key--設置的屬性名 $value--設置的屬性值,沒有返回值。it

__get($key):讀取類中非公開屬性時,將自動調用魔術方法。而且傳遞一個參數,$key--讀取的屬性名,返回值:想要顯示的屬性值。

__isset($key):在類外部使用isset()檢測非公開屬性時自動調用。

   >>> 類外部使用isset()檢測非公開屬性,摸人家呢不帶,返回false;

   >>> 因此,咱們可使用__isset(),在內部將檢測結果返回。

          function __isset($key){
              return isset($this->$key);
          }

 

__unset($key):在類外部使用unset()刪除私有屬性時,自動調用。

        function __unset($key){
            unset($this->$key);
        }

 

2. 繼承

 

2.1什麼叫繼承?

 子類繼承父類,子類就擁有父類中非私有的屬性和方法。

 

2.2如何實現繼承?

 給子類使用extends關鍵字,可讓子類繼承父類。

class Student extends Person()
 

2.3繼承的注意事項

 ① 子類只能繼承父類的私有屬性,不能繼承private屬性。

 ② 子類繼承父類後,至關於把父類非私有屬性和方法,直接copy到子類。能夠直接使用$this->調用,與子類自身的屬性和方法沒有區別!

 ③ PHP只支持單繼承,也就是一個類只能有一個父類。可是,PHP中能夠多層繼承,好比:

         class Person{}
         class Student extends Person{}
         class GoodStudent extends Student{}
         // GoodStudent繼承了Student類,也就擁有了Student類和Person類的全部非私有屬性和方法。

 

2.4方法重寫(方法覆蓋)

條件① 子類繼承父類

條件② 子類重寫父類已有的同名方法
 

符合上述兩個條件,稱爲方法覆蓋,也叫方法重寫。覆蓋以後,子類調用方法,將直接調用子類自身重寫以後的方法。

若是,子類重寫了父類方法,那麼在子類中如何調用父類的同名方法?

     Person::方法名(); // 使用父類名調用
     parent::方法名(); // 使用parent關鍵字代指父類名

 

因此,當子類繼承父類之後,第一步就是須要在子類中,重寫父類的構造函數。而在子類的構造函數中,第一步須要將父類的構造函數進行調用賦值。

         function __construct($name,$age,$school){
          parent::__construct($name,$age);
          $this->school = $school;
       }
相關文章
相關標籤/搜索