1. 封裝 |
經過訪問修飾符,將類中的屬性和方法進行私有化處理,並提供惟一的設置和讀取的函數
set/get方法,以實現訪問控制。這個過程稱爲封裝。this
注意:是實現訪問控制,而不是拒絕訪問。也就是說,單純的私有化屬性並非封裝,必須提供對應的set/get方法,控制用戶使用咱們提供的方法進行操做。spa
① 使用者只須要關心類可以提供哪些功能,而不須要關心這些功能的實現細節。(方法的封裝)code
② 對用戶的數據進行控制,防止設置不合法的數據,並控制返回給用戶的數據。(屬性的封裝)orm
① 方法的封裝對象
對於一些只須要在類內部使用,而不須要對外提供功能的函數,咱們可使用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()
① __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. 繼承 |
子類繼承父類,子類就擁有父類中非私有的屬性和方法。
給子類使用extends關鍵字,可讓子類繼承父類。
① 子類只能繼承父類的私有屬性,不能繼承private屬性。
② 子類繼承父類後,至關於把父類非私有屬性和方法,直接copy到子類。能夠直接使用$this->調用,與子類自身的屬性和方法沒有區別!
③ PHP只支持單繼承,也就是一個類只能有一個父類。可是,PHP中能夠多層繼承,好比:
class Person{} class Student extends Person{} class GoodStudent extends Student{} // GoodStudent繼承了Student類,也就擁有了Student類和Person類的全部非私有屬性和方法。
條件① 子類繼承父類
符合上述兩個條件,稱爲方法覆蓋,也叫方法重寫。覆蓋以後,子類調用方法,將直接調用子類自身重寫以後的方法。
若是,子類重寫了父類方法,那麼在子類中如何調用父類的同名方法?
Person::方法名(); // 使用父類名調用 parent::方法名(); // 使用parent關鍵字代指父類名
因此,當子類繼承父類之後,第一步就是須要在子類中,重寫父類的構造函數。而在子類的構造函數中,第一步須要將父類的構造函數進行調用賦值。
function __construct($name,$age,$school){ parent::__construct($name,$age); $this->school = $school; }