1. 程式人生 > >類的封裝性和繼承

類的封裝性和繼承

style mysql 類 我希望 自然 fun ima 直接 在外 語法

面向對象思想已經存在了好多年了,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();

類的封裝性和繼承