1、抽象類和接口this
一、抽象類spa
1)什麼是抽象類?code
抽象類就是包含抽象方法的類對象
抽象類其實就是一種規範blog
具備抽象方法的類必定是抽象類繼承
2)什麼是抽象方法?接口
沒有實現的成員方法,可是又給咱們指引了一個目標遊戲
3)爲何要使用抽象類io
要爲以後的程序定義規範function
4)何時使用抽象類
在須要對程序進行規範性定義時
5)如何聲明抽象類
使用 abstract 聲明一個抽象類
含有抽象方法的類必定是抽象類
抽象類不必定包含抽象方法
抽象方法必定要使用 abstract 關鍵字進行聲明,該方法必定沒有方法體,以分號結尾
抽象方法不能聲明爲私有的或是 final 修飾的
抽象類不容許直接使用(實例化)
抽象類要使用必須利用子類繼承並在子類中將抽象方法一次性所有實現後,方可以使用這些成員方法
抽象類中的抽象方法的聲明格式在利用子類繼承並實現方法時的格式必須保持一致(參數個數、是否爲靜態)
//聲明一個抽象類,具備抽象方法的類必定是抽象類,必須使用「abstract」來聲明 abstract class Person{ private $name="autumn"; private $sex="男"; private $age=25; public function info(){ echo "姓名:".$this->name.",性別:".$this->sex.",年齡:".$this->age; } public function say(){ echo "haha"; } //聲明抽象方法 abstract public function sleep(); abstract public function eat(); } //抽象類不容許直接被實例化使用 //只有全部的抽象方法在子類中所有同時被實現了,這些方法纔可以使用 class Admin extends Person { public function sleep(){ echo "我愛睡懶覺"; } public function eat(){ echo "我愛吃肉"; } } $p=new Admin; $p->sleep();
二、接口
1)什麼是接口?
全部的成員方法都爲抽象方法的抽象類
2)爲何要使用接口?
定義一種都沒法實現的規範
3)如何使用接口
使用 interface 關鍵字進行接口的聲明,而不是class,後跟接口名
接口當中不容許包含成員屬性
接口當中的成員方法必須是未實現的方法,無需使用 abstract 聲明
接口不容許直接實例化
繼承接口使用 implements 而不是extends
一個類能夠繼承多個接口,接口和接口之間使用「,」分隔
一個類只容許繼承一個父類,若要同時繼承一個父類和多個接口,要先繼承類再繼承接口
interface Person{ //接口不容許包含成員屬性 //private $name="autumn"; //接口能夠定義常量 const DB_HOST="localhost"; //成員方法不須要使用abstract聲明 function sleep(); function eat(); } interface Play{ function play(); } interface Sport{ function sport(); } class Boy{ public function boy(){ echo "i am a boy"; } } //接口不容許直接被實例化使用 //只有全部的抽象方法在子類中所有同時被實現了,這些方法纔可以使用 //一個類能夠同時繼承多個接口,但只能繼承一個類 class Admin extends Boy implements Person,Play,Sport{ function sleep(){ echo "我愛睡懶覺"; } function eat(){ echo "我愛吃肉"; } function play(){ echo "我不愛玩遊戲"; } function sport(){ echo "我愛運動"; } } $p=new Admin; $p->sleep(); $p->sport();
三、抽象類和接口的區別
1)抽象類使用 abstract 聲明,接口使用 interface 聲明
2)接口當中的方法必定都是抽象方法,抽象類當中的方法不必定全都是抽象方法
3)接口和抽象類都是對子類定義一種規範而產生的
4)接口是抽象類的特殊狀況
5)繼承接口使用 implements ,繼承抽象類使用 extends
6)接口能夠被同時繼承多個,而抽象類只能一次被繼承一個
2、對象的多態
一、什麼是多態?
聲明的類能夠表現出多種形態或者行爲
二、爲何要使用多態?
可使代碼更加簡便或具備更高的可重用性,讓程序具備高可擴展性
三、何時使用多態?
給程序留出必定的接口,調用不一樣的類,實現不一樣的功能
interface Usb{ function start(); function run(); function stop(); } class UDisk implements Usb{ public function start(){ echo "U盤開始..."; } public function run(){ echo "U盤運行..."; } public function stop(){ echo "U盤結束..."; } } class UMouse implements Usb{ public function start(){ echo "鼠標開始..."; } public function run(){ echo "鼠標運行..."; } public function stop(){ echo "鼠標結束..."; } } class UCamera implements Usb{ public function start(){ echo "攝像頭開始..."; } public function run(){ echo "攝像頭運行..."; } public function stop(){ echo "攝像頭結束..."; } } //未繼承接口的類 class UFan{ public function start(){ echo "風扇開始..."; } public function run(){ echo "風扇運行..."; } public function stop(){ echo "風扇結束..."; } } class Computer{ //類型約束,約束實例化對象必須爲繼承自Usb類的子類所實例化的 public function useUsb(Usb $obj){ $obj->start(); $obj->run(); $obj->stop(); } } $c=new Computer; $c->useUsb(new UCamera); echo "<hr>"; $c->useUsb(new UFan); //會報錯