接口是面向對象中的一個重要特性,也是面向對象開發不可缺少的一個概念,下面簡單說一下接口的概念,先看一段簡單的代碼:
1 interface ICanEat { 2 public function eat($food); 3 } 4 5 //Human類實現了ICanEat接口 6 class Human implements ICanEat { 7 public function eat($food){ 8 echo "Human eating " . $food . "<br />"; 9 } 10 } 11 12 // Animal類也實現了ICanEat接口 13 class Animal implements ICanEat { 14 public function eat($food){ 15 echo "Animal eating " . $food . "\n"; 16 } 17 } 18 19 // 不同的類可以實現同一個接口,定義接口方法的不同實現 20 $man = new Human(); 21 $man->eat("Apple"); 22 $monkey = new Animal(); 23 $monkey->eat("Banana"); 24 25 26 // 實現了某個接口的類必須提供接口中定義的方法 27 28 // 不能用接口創建對象,但是能夠判斷某個對象是否實現了某個接口 29 //$eatObj = new ICanEat(); 30 var_dump($man instanceof ICanEat); // 判斷某個對象是否實現了某個接口 31 32 function checkEat($obj){ 33 //定義方法判斷對象是否實現某個接口 34 if($obj instanceof ICanEat){ 35 $obj->eat('Apple'); 36 }else{ 37 echo "The Cant't eat"; 38 } 39 } 40 41 checkEat($man); 42 checkEat($monkey); 43 44 // 接口可以繼承接口 45 interface ICanDrink extends ICanEat { 46 public function drink(); 47 } 48 49 class Human1 implements ICanDrink{ 50 public function pee(){} 51 public function eat($food){} 52 }
代碼比較亂,重點就是那么一點,首先我們定義一個接口ICanEat,定義的語句是interface ICanEat{},里面可以定義一些方法,這些方法必須是public公有的類型,並且這個方法不用具體的實現,接下來定義了兩個類Human和Animal,都實現了ICanEat這個接口,就是都能吃東西,只不過具體吃的方法不太一樣,這就是接口的意義所在,即定義一些通用的方法好多類都同時實現這些方法,但是實現的方法不一樣,接口的作用就在於此,要注意,接口中定義的所有方法,實現接口的類中必須全部實現,不能實現其中幾個,只能全部實現,checkEat方法是判斷某個對象是否實現了一個接口。
另外不能用接口創建對象,或者說這種說法是錯誤的,只能說類實現了接口,對象實現了接口,這是個實現的關系
接口是可以繼承接口的,比如ICanDrink可以喝,雖然不是太合適,語句是:interface ICanDrink extends ICanEat{}這里面定義了方法drink,這樣就實現了接口的繼承
然后定義了類Human1實現了ICanDrink接口,那么這個類必須實現ICanDrink接口以及父接口ICanEat中的所有方法,就是說實現接口必須實現接口中的所有方法以及父接口所有的方法
總之,最核心的地方就是理解接口的作用和意義,它是提供了一些統一的方法去描述不同對象,不同對象都有其具體實現,基本就是這些東西。
至於多態呢,到這里就自然明白了,只要對象實現了某個接口,就直接可以通過對象調用接口的所有方法,接口實現的類方法有很多,這種現象就稱為多態,相同的代碼傳入的對象不一樣,所以具體實現方式也不一樣,這就是多態的真正含義。