当前位置:首页 > PHP教程 > php面向对象 > 列表

PHP面向对象之多态详解(代码实例)

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-16 10:03:49 浏览: 评论:0 

本文目标:

1、了解多态的定义

2、了解多态的作用

3、了解多态的使用场景

4、掌握多态的具体实现

还是按照之前一贯的思路,我们通过3W1H的方式进行学习,那么首先我们来了解一下

(一)、了解多态的定义

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

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

(二)、了解多态的作用

作用就是可以让一个接口可以有不同的实现,这样使得代码更加贴合于真实世界,这样的方式拉近了代码和真实世界的距离,从而让开发者们能更加方便地去实现实现中的一些复杂的业务逻辑

(三)、了解多态的使用场景

其实这个使用场景,在我们一旦决定用接口的时候,这种现象就会出现,因为一旦一个接口有不同的实现类的时候,基本上这种现象就会发生,因为很多时候我们希望一个接口里面的某个或者多个方法,可以有不同的具体实现

-比如吃的方法,每个动物有每个动物的吃法,老鼠和猫都是直接吃,不会去考虑讲不讲究卫生,所以不会去把食物先洗一下再吃,但是人呢,是高级动物,所以都会讲究基本的卫生(神经病的除外),会去洗一下再吃,而且还会判断有些东西必须要煮熟了再吃,而且因为文化的差异,每个国家的人的吃法也不同,比如印度人直接用手吃,而中国人是用筷子吃,而西方有些国家则是用叉子,吃有不同的吃法,这在现实生活里是非常常见的,那还有很多事情也都是如此,所以多态的这种现象也是非常普遍,而我们写代码是使用面向对象编程的方式写,所以难免也会遇到“多态”,而且为了让我们的代码更加贴合真实世界,我们也必须使用“多态”

(四)、掌握多态的具体实现

总结:

1、多态的定义就是每个接口可以有多个不同的实现

每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观

(五)、具体代码

1、案例一

实践目标:

1、多态的定义就是每个接口可以有多个不同的实现

  1. <?php 
  2.  
  3. //定义吃的接口 
  4.  
  5. interface Eat{ 
  6.  
  7.     public function eat(); 
  8.  
  9.  
  10. //定义猫的类 
  11.  
  12. class Cat implements Eat{ 
  13.  
  14.     public function eat(){ 
  15.  
  16.         echo "我是猫,抓到喜欢的老鼠,直接吃<br/>"
  17.  
  18.     } 
  19.  
  20.  
  21. //定义人 
  22.  
  23. class Human implements Eat{ 
  24.  
  25.     public function eat(){ 
  26.  
  27.         echo "我是人,吃东西之前,都会洗一下再吃,因为我要讲究基本的卫生<br/>"
  28.  
  29.     } 
  30.  
  31.  
  32.  
  33.  
  34. function Eat( $obj ){ 
  35.  
  36.     if$obj instanceof Eat ){ 
  37.  
  38.         $obj->eat(); 
  39.  
  40.     }else
  41.  
  42.         echo "该对象没有实现Eat的方法<br/>"
  43.  
  44.     } 
  45.  
  46.  
  47. $cat = new Cat(); 
  48.  
  49. $zs = new Human(); 
  50.  
  51. //这行代码看出,一个吃的方法,传递不同的具体实现,结果就是可以有不同的实现,这就是多态 
  52.  
  53. Eat($cat); 
  54.  
  55. Eat($zs); 
  56.  
  57. ?> 

运行结果为:

我是猫,抓到喜欢的老鼠,直接吃

我是人,吃东西之前,都会洗一下再吃,因为我要讲究基本的卫生

(六)、学以致用

问题:用面向对象的编程方式模拟出以下真实的场景,代码要能体现出多态的概念

一个农村老人小刘,养了5鸡,和5只狗,每天早上,他都会6点准时起床,煮稀饭,吃完稀饭后,然后他会提着2小桶食物去给鸡和鸭喂食,走到鸡栏边,它把其中的一桶米倒入鸡食槽里,走到狗窝旁,又把剩下的装有残羹剩菜的一桶食物倒入狗狗吃的食槽里

思路分析:

1、对象分析:里面的对象有老人,鸡,狗,食物 所以至少有这4个类

2、对象属性分析:(结合具体的场景+现实世界)

老人:名称

鸡:个数

狗:个数

食物:名称

3、对象方法分析:(结合具体的场景+现实世界)

老人:起床,煮稀饭,吃(吃稀饭),喂食

鸡:吃(啄米吃)

狗:吃(吃骨头)

食物:设置食物名称

4、综上分析,我们发现其中3个对象都有吃的方法,但是他们分别有不同的吃法,所以我们可以把这个公共方法抽离出来做成一个接口,然后让这3个类分别去实现它

具体实现代码如下:

  1. <?php 
  2.  
  3. //定义吃的接口 
  4.  
  5. interface Eat{ 
  6.  
  7.     public function eat($food); 
  8.  
  9.  
  10. //定义食物 
  11.  
  12. class Food{ 
  13.  
  14.     public $name = ""
  15.  
  16.     public function __construct( $name ){ 
  17.  
  18.         $this->name = $name
  19.  
  20.     } 
  21.  
  22.  
  23.  
  24.  
  25. //定义人 
  26.  
  27. class Human implements Eat{ 
  28.  
  29.     public $name = ""
  30.  
  31.     public function __construct( $name ){ 
  32.  
  33.         $this->name = $name
  34.  
  35.     } 
  36.  
  37.     //起床 
  38.  
  39.     public function wakeup(){ 
  40.  
  41.         echo $this->name."起床了<br/>"
  42.  
  43.     } 
  44.  
  45.     //煮稀饭 
  46.  
  47.     public function cook($food){ 
  48.  
  49.         echo $this->name."煮".$food->name."了<br/>"
  50.  
  51.     } 
  52.  
  53.     public function eat($food){ 
  54.  
  55.         echo $this->name."吃了".$food->name."<br/>"
  56.  
  57.     } 
  58.  
  59.     //喂食 
  60.  
  61.     function startFeed( $obj,$food ){ 
  62.  
  63.         if$obj instanceof Eat ){ 
  64.  
  65.             $obj->eat($food); 
  66.  
  67.         }else
  68.  
  69.             echo "该对象没有实现Eat的方法<br/>"
  70.  
  71.         } 
  72.  
  73.     } 
  74.  
  75.  
  76.  
  77.     public function feed($obj$food){ 
  78.  
  79.         $this->startFeed( $obj,$food ); 
  80.  
  81.     } 
  82.  
  83.  
  84. //定义鸡的类 
  85.  
  86. class Chiken implements Eat{ 
  87.  
  88.     public $count = 5; 
  89.  
  90.     public function eat($food){ 
  91.  
  92.         echo $this->count."只小鸡们,都吃了".$food->name."<br/>"
  93.  
  94.     } 
  95.  
  96.  
  97. //定义狗的类 
  98.  
  99. class Dog implements Eat{ 
  100.  
  101.     public $count = 5; 
  102.  
  103.     public function eat($food){ 
  104.  
  105.         echo $this->count."只小狗们,都吃了".$food->name."<br/>"
  106.  
  107.     } 
  108.  
  109.  
  110.  
  111.  
  112. //创建对象 
  113.  
  114. $xiaoliu = new Human("小刘"); 
  115.  
  116. $chikens = new Chiken(); 
  117.  
  118. $dogs = new Dog(); 
  119.  
  120. //创建食物 
  121.  
  122. $xfFood = new Food("稀饭"); 
  123.  
  124. $seedsFood = new Food("米"); 
  125.  
  126. $mealFood = new Food("残羹剩饭"); 
  127.  
  128. //老人起床 
  129.  
  130. $xiaoliu->wakeup(); 
  131.  
  132. //老人煮稀饭 
  133.  
  134. $xiaoliu->cook($xfFood); 
  135.  
  136. //老人吃稀饭 
  137.  
  138. $xiaoliu->eat( $xfFood ); 
  139.  
  140. //老人喂食开始 
  141.  
  142. $xiaoliu->feed($chikens,$seedsFood);//给小鸡喂食 
  143.  
  144. $xiaoliu->feed($dogs,$mealFood);//给小狗喂食 
  145.  
  146.  
  147.  
  148. ?> 

运行结果为:

小刘起床了

小刘煮稀饭了

小刘吃了稀饭

5只小鸡们,都吃了米

5只小狗们,都吃了残羹剩饭

(七)、总结

1、本文主要是讲了多态的定义和作用,以及具体的实现。

Tags: PHP面向对象 PHP多态

分享到: