interface 接口 和多态的含义

 1 <?php
 2 //interface关键字用于定义接口
 3 interface ICanEat{
 4     //接口里面的方法不需要方法的实现
 5     public function eat($food) ;
 6 }
 7 //implemaents关键字用于表示类实现某个接口
 8 class Human implements ICanEat{
 9     //实现了某个接口之后,必须提供接口中定义的方法的具体实现
10     public function eat($food) {
11         echo "Human eating ".$food."<br/>";
12     }
13 }
14 class animal implements ICanEat{
15     //实现了某个接口之后,必须提供接口中定义的方法的具体实现
16     public function eat($food) {
17         echo "Animal eating ".$food."<br/>";
18     }
19 }
20 $obj=new Human();
21 $obj->eat('Apple');
22 
23 $monkey = new Animal();
24 $monkey->eat('Banana');
25 
26 //不能实例化接口
27 //$eatObj = new ICanEat();
28 
29 //可以使用instanceof关键字来判断某个对象是否实现了某个接口
30 var_dump($obj instanceof ICanEat);
31 
32 function checkEat($obj) {
33     if($obj instanceof ICanEat) {
34         $obj->eat('food');
35     }else {
36         echo "The obj can't eat"."<br/>";
37     }
38 }
39 
40  checkEat($obj)."<br/>";
41  checkEat($monkey);
42 
43  //可以用extends让接口继承接口
44  interface ICanPee extends ICanEat{
45      public function pee();
46  }
47  //当类实现子接口时,父接口定义的方法也需要在这个类里面具体实现
48  class Human1 implements ICanPee{
49      public function pee() {}
50      public function eat($food){}
51  }

总结:

某个类实现(implements)了某个接口和继承(extends)了某个类的区别
  --实现接口和继承类很类似,但是接口不能直接创建自己的对象
     ··如果创建了“会吃东西这个对象”,那么具体怎么吃根本不知道
  --继承的父类必须有该方法的具体实现,子类可以重写父类的方法,也可以不重写
      接口里面的方法是不需要具体实现的,只要定义了方法的名称和参数就可以了,
  --具体的实现必须在实现类中定义
  --一句话概括:类的方法必须有实现,接口的方法必须为空

 

多态:

多态:因为接口的方法实现可以有很多种,所以对于接口里面的定义的方法具体实习是多种多样的,这种特性我们称为多态

比如接口A有两个实现B和C,B和C对A里面定义的方法的实现可以是不同的,这种现象就是多态

对于上面接口的例子中

1 //相同的一行代码,对于传入不同的接口的实现的对象的时候,表现是不同的,这就是多态
2  checkEat($obj);
3  checkEat($monkey);

 

posted @ 2015-07-04 13:29  todaytoday  阅读(705)  评论(0编辑  收藏  举报