【web 开发】PHP多态性详解及其应用

举报
迷彩 发表于 2023/07/25 00:26:51 2023/07/25
【摘要】 前言多态是面向对象的三大特性中除封装和继承之外的另一个重要的特性,它展现了动态绑定的功能,也称为: 同名异式.多态的功能可让软件在开发和维护时,达到充分的延伸性.事实上,多态最直接的定义就是让具有继承关系的不同对象.可以对相同名称的成员函数进行调用.产生不同的反应效果,所谓多态性是指一段程序能够处理多种类型对象的能力,例如:公司中一个发放工资的方法,公司内不同职位的员工工资,都是通过这个方法...

前言

多态是面向对象的三大特性中除封装和继承之外的另一个重要的特性,它展现了动态绑定的功能,也称为: 同名异式.多态的功能可让软件在开发和维护时,达到充分的延伸性.事实上,多态最直接的定义就是让具有继承关系的不同对象.可以对相同名称的成员函数进行调用.产生不同的反应效果,所谓多态性是指一段程序能够处理多种类型对象的能力,例如:公司中一个发放工资的方法,公司内不同职位的员工工资,都是通过这个方法发放的,但是不同的员工的工资是不同的,这样同一个发工资的方法就出现了多种形态.在PHP中,多态性指的就是方法的重写.方法重写是指在一个子类中可以重新修改父类中的某些方法,使其具有自己的特征,重写要求子类的方法和父类的方法的名称相同,这可以通过声明抽象类或接口来规范

接下来,我们通过计算机USB接口的应用来介绍一下面向对象的多态性.目前USB设置的种类有十几种,例如,USB鼠标,USB键盘,USB打印机,USB存储设备等等.这些计算机的外部设备都是通过USB接口连接计算机以后被计算机调用并启动运行的,也就是计算机正常运行的同时,每插入一种不同的USB设备,就为计算机扩展一种功能,这也正是我们所说的多态特征.那么为什么每个USB设备不一样,但都能被计算机应用呢? 那是因为每个USB设备都要遵守计算机USB接口的开发规范,都有相同的能被计算机加载并启用的方法,但运行各自相应的功能.这也正是我们对多态的定义.假设我们有一个主程序已经开发完成,需要在后期由其他开发人员为其扩展一些功能,但需要在不改动主程序的基础上就可以加载这些扩展的功能模块,其实也就是为程序开发一些插件.这就需要在不改动主程序的基础上就可以加载这些扩展的功能模块,其实也就是为程序开发一些插件.这就需要在主程序中为扩展的插件程序写好接口规范,每个插件只有按照规范去实现自己的功能,才能被主程序应用到.下面我们通过一张图来具体了解多态的概念:

多态性是对象多种表现形式的体现:

比如上面USB的例子当中:

同一个USB接口插入不同设备,能够实现的功能不一样,如果插入鼠标就可以通过点击发出指令操作电脑,如果插入的是键盘,那我们就可以通过键盘进行字符的输入及通过按键控制电脑,如果插入的打印机,那就可以实现使用电脑进行操作打印机执行打印及相关命令.

除了USB接口的例子,电脑的实际使用中,比如我们按下 F1 键这个动作:

  • 如果当前在 Flash 界面下弹出的就是 AS3 的帮助文档;
  • 如果当前在 Word 下弹出的就是 Word 帮助;
  • 在 Windows 下弹出的就是 Windows 帮助和支持。

同一个事件发生在不同的对象上会产生不同的结果。

多态的优点

1. 消除类型之间的耦合关系

2. 可替换性

3. 可扩充性

4. 接口性

5. 灵活性

6. 简化性

多态存在的三个必要条件

  1. 继承
  2. 重写
  3. 父类引用指向子类对象

多态的代码实现

下面通过实际的代码来了解面向对象的多态, 在计算机中应用USB设备的程序设计如下所示:

定义一个USB接口,上一节.我们详细讲解过接口的定义和使用以及相关概念,这里就不再赘述.

<?php
interface USB{
	//接口中的抽象方法
	function run();
}

声明一个计算机类,通过计算机类使用相关的USB设备:

<?php
class Computer{
	
	function runUSB($usb){
		$usb->run();
	}
}

上面我们声明创建了一个USB接口,并且在接口中声明了一个名为run()的抽象方法,目的就是为了通过接口定义一个规范,让每个USB设备都去遵守这些规范。也就是子类设备中必须实现run()方法,这样才能被计算机应用到,并按照设备自己的功能去实现它.因为在上面计算类Computer中的runUSB()方法中,不管是任何设备,都是通过调用一个run()方法{$usb->run()}.因此,如果不按照接口的规范而随意命名USB设备的运行方法名,就算方法中的代码写得多好,当你将这个设备插入计算以后也是不能启动的,因为根本无法调用到这个随意命名的的运行方法.我们了解接口的相关规范,接着我们根据USB接口定义的规范来实现USB接口在不同设备中的相关功能,这里只实现USB鼠标,USB键盘和USB打印机等设备,当然你还可以实现更多的USB设备比如U盘,移动硬盘,USB摄像头等等.代码如下:

<?php
//USB鼠标实现类
class UMouse implements USB{
	//遵守接口规范,重写接口中的run()方法
	function run(){
		echo "启动并运行USB鼠标设备<br/>";
	}
}

//USB键盘实现类
class UKey implements USB{
	//遵守接口规范,重写接口中的run()方法
	function run(){
		echo "启动并运行USB键盘设备<br/>";
	}
}

//USB打印机实现类
class UPrint implements USB{
	//遵守接口规范,重写接口中的run()方法
	function run(){
		echo "启动并运行USB打印机设备<br/>";
	}
}

接着我们通过计算机类来调用相关设备:

<?php
$com = new Computer();
$com->runUSB(new UMouse());
$com->runUSB(new UKey());
$com->runUSB(new UPrint());

执行结果如下图:

由于每个实现类中都按设备的功能重写了run()方法,所以设备当插入计算启动运行后每个USB设备都有自己的形态或动作.多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。