PHP面向对象之多态详解(代码实例)
本文目标:
1、了解多态的定义
2、了解多态的作用
3、了解多态的使用场景
4、掌握多态的具体实现
还是按照之前一贯的思路,我们通过3W1H的方式进行学习,那么首先我们来了解一下
(一)、了解多态的定义
因为接口的方法实现可以有很多,所以对于接口里面定义的方法的具体实现是多种多样的,这种特性我们称作“多态”
-比如接口A有2个实现B和C,B和C对A里面定义的方法可以是不同的,这种现象就是多态
(二)、了解多态的作用
作用就是可以让一个接口可以有不同的实现,这样使得代码更加贴合于真实世界,这样的方式拉近了代码和真实世界的距离,从而让开发者们能更加方便地去实现实现中的一些复杂的业务逻辑
(三)、了解多态的使用场景
其实这个使用场景,在我们一旦决定用接口的时候,这种现象就会出现,因为一旦一个接口有不同的实现类的时候,基本上这种现象就会发生,因为很多时候我们希望一个接口里面的某个或者多个方法,可以有不同的具体实现
-比如吃的方法,每个动物有每个动物的吃法,老鼠和猫都是直接吃,不会去考虑讲不讲究卫生,所以不会去把食物先洗一下再吃,但是人呢,是高级动物,所以都会讲究基本的卫生(神经病的除外),会去洗一下再吃,而且还会判断有些东西必须要煮熟了再吃,而且因为文化的差异,每个国家的人的吃法也不同,比如印度人直接用手吃,而中国人是用筷子吃,而西方有些国家则是用叉子,吃有不同的吃法,这在现实生活里是非常常见的,那还有很多事情也都是如此,所以多态的这种现象也是非常普遍,而我们写代码是使用面向对象编程的方式写,所以难免也会遇到“多态”,而且为了让我们的代码更加贴合真实世界,我们也必须使用“多态”
(四)、掌握多态的具体实现
总结:
1、多态的定义就是每个接口可以有多个不同的实现
每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观
(五)、具体代码
1、案例一
实践目标:
1、多态的定义就是每个接口可以有多个不同的实现
<?php //定义吃的接口 interface Eat{ public function eat(); } //定义猫的类 class Cat implements Eat{ public function eat(){ echo "我是猫,抓到喜欢的老鼠,直接吃<br/>"; } } //定义人 class Human implements Eat{ public function eat(){ echo "我是人,吃东西之前,都会洗一下再吃,因为我要讲究基本的卫生<br/>"; } } function Eat( $obj ){ if( $obj instanceof Eat ){ $obj->eat(); }else{ echo "该对象没有实现Eat的方法<br/>"; } } $cat = new Cat(); $zs = new Human(); //这行代码看出,一个吃的方法,传递不同的具体实现,结果就是可以有不同的实现,这就是多态 Eat($cat); Eat($zs); ?>
运行结果为:
我是猫,抓到喜欢的老鼠,直接吃
我是人,吃东西之前,都会洗一下再吃,因为我要讲究基本的卫生
(六)、学以致用
问题:用面向对象的编程方式模拟出以下真实的场景,代码要能体现出多态的概念
一个农村老人小刘,养了5鸡,和5只狗,每天早上,他都会6点准时起床,煮稀饭,吃完稀饭后,然后他会提着2小桶食物去给鸡和鸭喂食,走到鸡栏边,它把其中的一桶米倒入鸡食槽里,走到狗窝旁,又把剩下的装有残羹剩菜的一桶食物倒入狗狗吃的食槽里
思路分析:
1、对象分析:里面的对象有老人,鸡,狗,食物 所以至少有这4个类
2、对象属性分析:(结合具体的场景+现实世界)
老人:名称
鸡:个数
狗:个数
食物:名称
3、对象方法分析:(结合具体的场景+现实世界)
老人:起床,煮稀饭,吃(吃稀饭),喂食
鸡:吃(啄米吃)
狗:吃(吃骨头)
食物:设置食物名称
4、综上分析,我们发现其中3个对象都有吃的方法,但是他们分别有不同的吃法,所以我们可以把这个公共方法抽离出来做成一个接口,然后让这3个类分别去实现它
具体实现代码如下:
<?php //定义吃的接口 interface Eat{ public function eat($food); } //定义食物 class Food{ public $name = ""; public function __construct( $name ){ $this->name = $name; } } //定义人 class Human implements Eat{ public $name = ""; public function __construct( $name ){ $this->name = $name; } //起床 public function wakeup(){ echo $this->name."起床了<br/>"; } //煮稀饭 public function cook($food){ echo $this->name."煮".$food->name."了<br/>"; } public function eat($food){ echo $this->name."吃了".$food->name."<br/>"; } //喂食 function startFeed( $obj,$food ){ if( $obj instanceof Eat ){ $obj->eat($food); }else{ echo "该对象没有实现Eat的方法<br/>"; } } public function feed($obj, $food){ $this->startFeed( $obj,$food ); } } //定义鸡的类 class Chiken implements Eat{ public $count = 5; public function eat($food){ echo $this->count."只小鸡们,都吃了".$food->name."<br/>"; } } //定义狗的类 class Dog implements Eat{ public $count = 5; public function eat($food){ echo $this->count."只小狗们,都吃了".$food->name."<br/>"; } } //创建对象 $xiaoliu = new Human("小刘"); $chikens = new Chiken(); $dogs = new Dog(); //创建食物 $xfFood = new Food("稀饭"); $seedsFood = new Food("米"); $mealFood = new Food("残羹剩饭"); //老人起床 $xiaoliu->wakeup(); //老人煮稀饭 $xiaoliu->cook($xfFood); //老人吃稀饭 $xiaoliu->eat( $xfFood ); //老人喂食开始 $xiaoliu->feed($chikens,$seedsFood);//给小鸡喂食 $xiaoliu->feed($dogs,$mealFood);//给小狗喂食 ?>
运行结果为:
小刘起床了
小刘煮稀饭了
小刘吃了稀饭
5只小鸡们,都吃了米
5只小狗们,都吃了残羹剩饭
(七)、总结
1、本文主要是讲了多态的定义和作用,以及具体的实现
希望本文能给大家带来一定的帮助,谢谢!!!
以上是PHP面向对象之多态详解(代码实例)的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

如何使用Go语言实现面向对象的事件驱动编程引言:面向对象的编程范式被广泛应用于软件开发中,而事件驱动编程是一种常见的编程模式,它通过事件的触发和处理来实现程序的流程控制。本文将介绍如何使用Go语言实现面向对象的事件驱动编程,并提供代码示例。一、事件驱动编程的概念事件驱动编程是一种基于事件和消息的编程模式,它将程序的流程控制转移到事件的触发和处理上。在事件驱动

当对象在Jackson库中具有父子关系时,将使用@JsonIdentityInfo注释。@JsonIdentityInfo 注解 用于在序列化和反序列化过程中指示对象身份。ObjectIdGenerators.PropertyGenerator是一个抽象占位符类,用于表示要使用的对象标识符来自POJO属性的情况。语法@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

Go语言支持面向对象编程,通过类型定义和方法关联实现。它不支持传统继承,而是通过组合实现。接口提供了类型间的一致性,允许定义抽象方法。实战案例展示了如何使用OOP管理客户信息,包括创建、获取、更新和删除客户操作。

PHP中OOP最佳实践包括命名约定、接口与抽象类、继承与多态、依赖注入。实战案例包括:使用仓库模式管理数据,使用策略模式实现排序。

Go语言支持面向对象编程,通过struct定义对象,使用指针接收器定义方法,并通过接口实现多态。面向对象特性在Go语言中提供了代码重用、可维护性和封装,但也存在缺乏传统类和继承的概念以及方法签名强制类型转换的局限性。

解析PHP面向对象编程中的享元模式在面向对象编程中,设计模式是一种常用的软件设计方法,它可以提高代码的可读性、可维护性和可扩展性。享元模式(Flyweightpattern)是设计模式中的一种,它通过共享对象来降低内存的开销。本文将探讨如何在PHP中使用享元模式来提高程序性能。什么是享元模式?享元模式是一种结构型设计模式,它的目的是在不同对象之间共享相同的

在Golang(Go语言)中并没有传统意义上的类的概念,但它提供了一种称为结构体的数据类型,通过结构体可以实现类似类的面向对象特性。在本文中,我们将介绍如何使用结构体实现面向对象的特性,并提供具体的代码示例。结构体的定义和使用首先,让我们看一下结构体的定义和使用方式。在Golang中,结构体可以通过type关键字定义,然后在需要的地方使用。结构体中可以包含属

C#(CSharp)是一门强大而受欢迎的面向对象编程语言,广泛应用于软件开发领域。在C#开发过程中,了解面向对象编程(OOP)的基本概念和设计原则是非常重要的。面向对象编程是一种编程范式,它将现实世界中的事物抽象为对象,并通过对象之间的交互来实现系统功能。在C#中,类是面向对象编程的基本构建块,用于定义对象的属性和行为。在进行C#开发时,有几个重要的设计原
