php接口和多态的概念以及简单应用
接口是面向对象中的一个重要特性,也是面向对象开发不可缺少的一个概念,下面简单说一下接口的概念,先看一段简单的代码:
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中的所有方法,就是说实现接口必须实现接口中的所有方法以及父接口所有的方法
总之,最核心的地方就是理解接口的作用和意义,它是提供了一些统一的方法去描述不同对象,不同对象都有其具体实现,基本就是这些东西。
至于多态呢,到这里就自然明白了,只要对象实现了某个接口,就直接可以通过对象调用接口的所有方法,接口实现的类方法有很多,这种现象就称为多态,相同的代码传入的对象不一样,所以具体实现方式也不一样,这就是多态的真正含义。