PHP接口的介绍与实现
什么是接口(interface) ?
接口是方法的抽象,如果不同的类有同样的方法,那么就应该考虑使用接口。
(1)接口是一个行为的规范、协议。其实就是类和类之间的一种协定,一种约束
(2)C#不支持多继承,但是他把这个功能交给接口来实现。
(3)类与类之间的系统资源调用方式不一样,导致他们之间的通信很困难,而接口可以屏蔽掉它们之间的差异,能使他们顺利通信。
什么是抽象类(abstractclass)?
1. 抽象类仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造函数。抽象类可以同时有抽象方法和具体方法。一个抽象类不会有实例,这些构造函数不能被客户端调用来创建实例。一个抽象类的构造函数可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共同的实现,而不同的子类可以在此基础上有其自己的实现。
2. 抽象类的用途1) 具体类不是用来继承的。 ScottMeyers曾指出,只要有可能,不要丛具体类继承。2) 假设有2个具体类,类A和类B,类B是类A的子类,那么一个最简单的修改方案是应当建立一个抽象类(或java接口)C,然后让类A和类B成为抽象类C的子类。3) 抽象类应当拥有尽可能多的共同代码。以提高代码的复用率。4) 抽象类应当拥有尽可能少的数据。
3. 基于抽象类的模式和原则1) 针对抽象编程,不要针对具体编程。2) 尽量使用合成(Composition),而不要使用继承来达到复用的目的。3) 使用摸板方法模式
4. 什么时候应当使用继承复用1) 子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分”is– a” 和“has-a”两种关系。2) 永远不会出现需要将子类换成另一个子类的情况。如果设计师不是很肯定一个类回不会在将来变成另一个类的子类的话,就不应当把这个类设计成这个超类的子类。3) 子类具有扩展超类的责任,而不是具有置换掉(Override)或注销掉(Nullify)超类的责任。4) 只有在分类学上有意义时,才可以使用继承,不要丛工具类继承。
抽象方法是必须实现的方法。且只能在抽象类中。
接口与抽象类
一个类可以继承多个接口。。。
一个类只能继承一个抽象类。。。
抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。
动物类要有呼吸方法。怎么呼吸就是子类的事了。
现在有很多讨论和建议提倡用interface代替abstract类,两者从理论上可以做一般性的混用,但是在实际应用中,他们还是有一定区别的。抽象类一般作为公共的父类为子类的扩展提供基础,这里的扩展包括了属性上和行为上的。而接口一般来说不考虑属性,只考虑方法,使得子类可以自由的填补或者扩展接口所定义的方法,就像JAVA王子所说的事件中的适配器就是一个很好的应用。
用一个简单的例子,比如说一个教师,我们把它作为一个抽象类,有自己的属性,比如说年龄,教育程度,教师编号等等,而教师也是分很多种类的,我们就可以继承教师类而扩展特有的种类属性,而普遍属性已经直接继承了下来。
而接口呢~还是拿教师做例子,教师的行为很多,除了和普通人相同的以外,还有职业相关的行为,比如改考卷,讲课等等,我们把这些行为定义成无body的方法,作为一个集合,它是一个interface。而教师张三李四的各自行为特点又有不同,那么他们就可以扩展自己的行为body。从这点意义上来说,interface偏重于行为。
总之,在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。
接口定义了实现某种服务的一般规范,声明了所需的函数和常量,但不指定如何实现。之所以不给出实现的细节,是因为不同的实体可能需要用不同的方式来实现公共的方法定义。关键是要建立必须实现的一组一般原则,只有满足了这些原则才能说实现了这个接口。
接口中不定义类成员!类成员的定义完全交给实现类来完成。
先来看一个简单的例子,有个全面的认识:
01
|
<?php
|
02
|
interface Fruit
|
03
|
{
|
04
|
const MAX_WEIGHT = 5; //此处不用声明,就是一个静态常量
|
05
|
function setName( $name );
|
06
|
function getName();
|
07
|
}
|
08
|
//实现接口
|
09
|
class Apple implements Fruit
|
10
|
{
|
11
|
private $name ;
|
12
|
function getName() {
|
13
|
return $this ->name;
|
14
|
}
|
15
|
function setName( $_name ) {
|
16
|
$this ->name = $_name ;
|
17
|
}
|
18
|
}
|
19
|
20
|
$apple = new Apple(); //创建对象
|
21
|
$apple ->setName( "苹果" );
|
22
|
echo "创建了一个" . $apple ->getName();
|
23
|
echo "<br />" ;
|
24
|
echo "MAX_GRADE is " . Apple::MAX_WEIGHT; //静态常量
|
25
|
?>
|
拿侵占公司财物作为例子。这可以用很多方式来完成,取决于是谁来做这种不光彩的事情。例如,一名普通员工可能使用办公室信用卡购买鞋子和电影票,然后在购买单据上写上“办公用品”,而一名主管可能让他的助手通过在线账户系统向他的瑞士银行户头汇款。这两种员工都能完成这个任务,但方式不一样。在这种情况下,接口的目标就是定义侵占公司的一组原则,然后要求各个类分别实现这个接口。例如,接口可能只包括两个方法:
1
|
emptyBankAccount()
|
2
|
burnDocuments()
|
然后可以要求Employee和Executive类实现这些特性。在本节中,我们将学习到这些内容。不过,首先要花点时间理解PHP5是如何实现接口。在PHP中,要这样创建接口:
1
|
interface IinterfaceName
|
2
|
{
|
3
|
CONST 1;
|
4
|
...
|
5
|
CONST N;
|
6
|
function methodName1();
|
7
|
...
|
8
|
function methodNameN();
|
9
|
}
|
通常,在接口名前面加上字母I来进行标识,以便更容易辨认。
当类通过implements关键字实现了接口后,就完成了一个契约。接口中的所有方法都必须实现,倘若实现类没有实现所有的方法,则必须声明为抽象类,否则将出现下面所示的致命错误:
1
|
Fatal error: Class aaa contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (IinterfaceName::methodNameN) in D:\www\test.php on line 11
|
以下是实现上述接口的一般语法:
1
|
class aaa implements IinterfaceName{
|
2
|
function methodName1(){
|
3
|
echo "fda" ;
|
4
|
}
|
5
|
|
6
|
function methodNameN(){
|
7
|
echo "methodNameN" ;
|
8
|
}
|
9
|
}
|
实现一个接口
下面给出PHP接口实现的一个实际例子,在此创建并实现了一个名为IPillage的接口,IPillage接口如下:
1
|
interface IPillage
|
2
|
{
|
3
|
function emptyBakAccount();
|
4
|
function burnDocument();
|
5
|
}
|
然后通过Executive类实现此接口:
01
|
class Executive extends Employee implements IPillage
|
02
|
{
|
03
|
private $totalStockOptions ;
|
04
|
function emptyBankAccount()
|
05
|
{
|
06
|
echo "Call CFO and ask to transfer funds to Swiss bank account." ;
|
07
|
}
|
08
|
function burnDocuments()
|
09
|
{
|
10
|
echo "Torch the office suite." ;
|
11
|
}
|
12
|
}
|
因为公司中所有级别的人都能进行侵占,所以可以有Assistant类实现此接口:
01
|
class Assistant extends Employee implements IPillage
|
02
|
{
|
03
|
function takeMome()
|
04
|
{
|
05
|
echo "Taking memo..." ;
|
06
|
}
|
07
|
function emptyBankAccount()
|
08
|
{
|
09
|
echo "Go on shopping spree with office credit card." ;
|
10
|
}
|
11
|
function burnDocuments()
|
12
|
{
|
13
|
echo "Start small fire in the trash can." ;
|
14
|
}
|
15
|
}
|
可以看到,接口特别有用。因为,虽然它们定义了发生某一行为需要多少个方法,以及各个方法的名字,但接口允许不同的类,以不同的方式来实现这些方法。在这个例子中,对于烧文件的方法,Assistdnt类只是把文件在垃圾筒里烧掉,而Executive类则通过更过分的方式来做到(将它的办公室烧掉)。
实现多个接口
如果我们允许外来承包商侵占公司是不公平的,毕竟公司是在所有全职员工的努力之下建立的。就是说,怎样为员工提供工作和侵占公司的功能,而限制承包商只能完成所需的任务呢?解决的办法是将这些任务分成几项任务,然后实现必要的多个接口。PHPS 支持这个特性。考虑如下例子:
01
|
<?php
|
02
|
interface IEmployee{...}
|
03
|
interface IDeveloper{...}
|
04
|
interface IPillage{...}
|
05
|
class Employee implements IEmployee,IDeveloper,iPillage {
|
06
|
...
|
07
|
}
|
08
|
class Contractor implements IEmployee,IDeveloper {
|
09
|
...
|
10
|
}
|
11
|
?>
|
可以看到,员工类可以实现所有3个接口,而承包商类只能实现IEmployee和IDeveloper。
PHP接口的介绍与实现相关推荐
- JAVA中常用接口的介绍及使用示例 java lang Comparable
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JAVA ...
- Vivado FIFO IP核接口信号介绍
1.1 Vivado FIFO IP核接口信号介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Vivado FIFO IP核接口信号介绍: 5)结束语. 1.1.2 ...
- Vivado MMCM IP核接口信号介绍
1.1 Vivado MMCM IP核接口信号介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Vivado MMCM IP核接口信号介绍: 5)结束语. 1.1.2 ...
- vue和Java做数据交互_基于vue和springmvc前后端分离,json类接口调用介绍
基于vue和springmvc前后端分离,json类接口调用介绍 版本要求:spring-3.2.9.RELEASE.vue-2.9.2.axios-0.17.1,其中axios作为http clie ...
- 千兆光纤 GBIC和SFP接口规格介绍
千兆光纤 GBIC和SFP接口规格介绍 分类: 系统运维 來源:網路 1.何为GBIC? GBIC是Giga Bitrate Interface Converter的缩写,是将千兆位电信号转换为光信 ...
- jdk8函数式接口——Consumer介绍
Consumer介绍与实例分析 函数式接口:@FunctionalInterface Consumer(消费者) 函数式接口:@FunctionalInterface 自从jdk8提供了函数式接口这一 ...
- vba 云服务器,EXCEL服务器中VBA接口函数介绍
EXCEL服务器中VBA接口函数介绍 日期:2017-11-27 14:40 | 分类:最新资讯 | 人气: EXCEL服务器中VBA接口函数 SaveReport 作用:保存报表模板或者报表 ...
- iTOP-4418嵌入式开发板接口基本介绍
iTOP-4418嵌入式开发板是迅为电子设计研发的一款四核Cortex-A9开发板,可广泛适用于工控.智能家居.医疗.多媒体.安防.车载.金融.消费电子.手持设备.显示控制.教学.电力.通讯等领域. ...
- Type-C接口简单介绍-面向单片机应用
Type-C接口简单介绍-面向单片机应用 1.绪论 用单片机做一些东西时,Type-C接口逐渐替代了MicroUSB接口.但不像MicroUSB那样只有5V.GND.D+.D-.ID五个接口,Type ...
- 笔记本各种接口功能介绍
笔记本各种接口功能介绍 其实当我们购买笔记本时很少考虑到接口问题,并且有些消费者认为USB和网口都有就OK.但是我要告诉大家的是除了我们经常要用的USB接口和网口之外,其他接口的配备也是很重要的. ...
最新文章
- 如何去除使用inline-block之后的间距(二)?
- SAP freelancer夫妻并不难!你也可以!
- 查找运行时间超过1天的frmweb进程
- luogu_2107【题解】
- echarts 折线图 设置y轴最小刻度_【硬货】vue全家桶+Echarts+百度地图,搭建数据可视化系统...
- wrf 嵌套网格作用_在网格系统中使用响应列,嵌套列和偏移列 引导程序
- mysql数据库open函数_C#访问Mysql数据库方法,以及库函数
- OJ1034: 夏季促销
- 基础知识(九)boost+vs2015安装配置
- 太实用了,4款常用的可视化大屏工具,你一定要知道!
- lua的元表、模块和面向对象
- win10 安装oracle 11gR2_database出现universal Installer后闪退就没反应的解决方案
- VS2012 VS2010 VTK引入设置
- Android WiFi 连接 (Connect,no Internet,带叉)
- Git 工具 - 储藏(Stashing) git stash 暂存现在工作区的内容
- PS学习-制作下雨效果
- Java安装环境变量
- 矿物质饲料的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- Spring中的切入点表达式写法
- nginx配置本地静态资源路径