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、多态的定义就是每个接口可以有多个不同的实现
- <?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、本文主要是讲了多态的定义和作用,以及具体的实现。
Tags: PHP面向对象 PHP多态
- 上一篇:PHP面向对象之接口详解(代码实例)
- 下一篇:最后一页
相关文章
- ·PHP 面向对象 继承(2013-11-14)
- ·PHP面向对象开发——封装关键字(2013-11-14)
- ·php面向对象__toString() 用法详解(2014-02-20)
- ·php面向对象__call处理错误调用技巧(2014-02-20)
- ·php面向对象中子类中重载父类详解(2014-02-20)
- ·php面向对象的封装性说明(2014-05-21)
- ·PHP面向对象编程入门教程(2014-08-02)
- ·PHP5 中的常量 PHP 面向对象(2014-09-09)
- ·PHP 面向对象 final类与final方法(2014-09-09)
- ·php面向对象:观察者模式示例(2015-04-13)
- ·php面向对象之工厂模式示例(2015-04-13)
- ·PHP面向对象(OOP)编程:this的特殊用法(2015-12-12)
- ·php面试之面向对象的相关知识介绍(2019-12-16)
- ·聊聊php面向对象的编程基础(一)(2020-03-31)
- ·聊聊php面向对象的编程基础(二)(2020-03-31)
- ·php面向对象和面向过程有什么区别(2020-04-16)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)