類的封裝性和繼承
面向對象思想已經存在了好多年了,PHP之前沒有面向對象,是PHP開發者後期加上的。
面向對象思想有三大特征,封裝,繼承,多態,其中多態並不適用於PHP。
之前使用的是public關鍵詞,它的意思是公開的,意思就是只要拿到這個類,誰都可以使
用,誰都可以賦值調用,重新賦值調用。
封裝:即禁止某些方法/屬性 ,不充許外部調用。並開放部分方法 ,來間接調用。
比如 銀行的 ATM, 你可以輸入密碼 " 檢測 " 用戶的密碼是否正確, 但不能 " 查詢 " 用戶的密碼。
代碼 :
1 class ATM{ 2 //protected 受保護的,只允許本類內部使用,外部方法調用。設置了外部無法訪問的權 3限。 4 protected function getPass(){ 5 return ‘123456‘; 6 } public function checkPass($pass){ 7 return $pass == $this->getPass(); 8 }}$atm = new ATM(); 9 $atm = checkPass(‘1234456‘); 10 $atm->getPass(); //出錯
以上如果用面向過程的函數來開發,則比較難實現屏蔽的功能。
以上是方法的封裝,設置關鍵詞protected關鍵詞,受保護的,可以有效防止外部調用,但內部又可
以使用的策略,同樣的方法適用於屬性。
1 <?php 2 //面向對象的封裝 3 //public private 4 5 class A{ 6 public $name = ‘加州‘; 7 //只能在自己和家族範圍訪問 不能在外部範圍訪問 8 protected $sex = ‘鄭州‘; 9 public function test(){ 10 echo $this->sex; 11 } } $p = new A; 12 //可以輸出,因為是public公開的。 13 echo $p->name; 14 //不能輸出,設置了protected受保護的,外部方法調用。15 //echo $p->sex; 16 //但如果我就想輸出怎麽辦? 17 //可以利用test方法,因為test方法屬於A類,讓test本類中的方法去調用本類的屬性。 18 $p->test();
以上我們總結一下:
public 公開的,類內部,外部均可調用。
protected 受保護的,內部可調用,外部無法調用。
另外還有一種,private 私有的,除了自己其他都無法訪問
網上有人給我們提供了 一個MySQL 類 , 我們可以直接new使用。
但我如果覺得這個類的某個方法不好 , 或者缺少某個方法 , 怎麽辦?
類繼承的語法:
1 class A{ 2 public function youQian(){ 3 echo "老子有錢"; 4 } 5 }//使用extends關鍵詞繼承。 6 // class 子類(用戶定義的) extends 父類(現有的類){} 7 class Aa extends A{ 8 public function qiong(){ 9 echo "我是真的窮"; 10 } 11 }//子類繼承父類以後,父類的方法可直接使用。 12 $erzi = new Aa(); 13 $erzi->youQain(); 14 $erzi->qiong();
如果重名會怎麽樣?
1 class A{ 2 public function youQian(){ 3 echo "老子有錢"; 4 } 5 }//使用extends關鍵詞繼承。 6 // class 子類(用戶定義的) extends 父類(現有的類){} 7 class Aa extends A{ 8 public function youQian(){ 9 echo "我比你更有錢"; 10 } 11 }//子類繼承父類以後,父類的方法可直接使用。 12 $erzi = new Aa(); 13 //如果重名,會直接輸出子類的方法,這在PHP面向對象中叫覆蓋重寫。 14 $erzi->youQain();
所以,看需求,你覺得原來的類中,有個方法不好用,可以繼承以後重寫,有人問,那我直接在原
基礎的類上直接修改不行嗎?幹嘛還要繼承以後再重寫?
class A{ public function youQian(){ echo "老子有錢"; } public function benShi(){ echo "老子不光有錢,本事才是最重要的"; } }//使用extends關鍵詞繼承。 // class 子類(用戶定義的) extends 父類(現有的類){} class Aa extends A{ public function youQian(){ echo "我?你更有錢"; } }/* 註意:雖然我們覺得A類中,youQian()這個方法不太好,我希望重寫,但一個類中不只有一個 類,還有大量的其他的方法,這些?法我覺得都很好,所以我想既要留著其他的方法供我使用,我 還想重寫youqian這個方法。 */ //子類繼承父類以後,父類的方法可直接使用。 $erzi = new Aa(); //如果重名,會直接輸出子類的方法,這在PHP面向對象中叫覆蓋重寫。 $erzi->youQain();
不僅如此,繼承以後,還可以在?類中繼續新增方法,在原有的基礎上,可以無限擴充你想要的功
能:
1 class A{ 2 public function youQian(){ 3 echo "有錢"; 4 } 5 6 public function benShi(){ 7 echo "不光有錢,本事才是最重要的"; 8 } 9 } 10 //使用extends關鍵詞繼承。 11 // class 子類(用戶定義的) extends 父類(現有的類){} 12 class Aa extends A{ 13 public function youQian(){ 14 echo "我比你更有錢"; 15 } 16 17 public function genBenShi(){ 18 echo "我比老爺子更有本事"; 19 } 20 }/* 21 註意:雖然我們覺得A類中,youQian()這個?法不太好,我希望重寫,但一個類中不只有一個 22 類,還有大量的其他的方法,這些方法我覺得都很好,所以我想既要留著其他的方法供我使用,我 23 還想重寫youqian這個方法。 24 */ 25 //子類繼承父類以後,父類的方法可直接使用。 26 $erzi = new Aa(); 27 //如果重名,會直接輸出子類的方法,這在PHP面向對象中叫覆蓋重寫。 28 $erzi->youQain(); 29 //調用自己寫的方法 30 $erzi->genBenshi();
繼承的好處:
子類可以繼承父類的屬性及方法 , 並允許覆蓋父類的方法或新增方法
通過自然界的比喻就是,通過"進化"來獲得新特性,同時不影響舊物種。
註意:
PHP的繼承是單繼承。
一個子類只能繼承一個父類。
但可以形成孫子繼承。
1 <?php 2 class A{ 3 4 } 5 class B{ 6 } 7 class C extends A{ 8 9 10 } 11 class C extends B{ 12 } 13 //PHP是單繼承,一個子類只能繼承一個父類,不能有兩個爹。 14 $aa = new C();
形成孫子繼承:
1 <?php 2 //自類繼承父類中的所有內容 3 4 class A{ 5 public function sayA(){ 6 echo $this->name; 7 } } //不僅僅是可以向下 也可以向上 8 class B extends A{ 9 // A 裏面的sayA C裏面的sayC 這兩個方法都可以訪問B類裏面的受保護的屬 protected $name =‘滿身大漢‘; 10 } class C extends B{ 11 public function sayC(){ 12 echo $this->name; 13 } } $p = new C; 14 $p->sayC(); 15 $p->sayA();
不僅如此,PHP的繼承還可以有多個兒子。
1 <?php 2 class A{ 3 4 } 5 class C extends A{ 6 7 8 } 9 class D extends A{ 10 } 11 //PHP是單繼承,但可以有多個兒子。 12 $aa = new C();
類的封裝性和繼承