接口定义了实现某种服务的一般规范,声明了所需的函数和常量,但不指定如何实现。之所以不给出实现的细节,是因为不同的实体可能需要用不同的方式来实现公共的方法定义。关键是要建立必须实现的一组一般原则,只有满足了这些原则才能说实现了这个接口。
接口中不定义类成员!类成员的定义完全交给实现类来完成。
先来看一个简单的例子,有个全面的认识:
04 |
const MAX_WEIGHT = 5; //此处不用声明,就是一个静态常量 |
05 |
function setName($name); |
09 |
class Apple implements Fruit |
15 |
function setName($_name) { |
20 |
$apple = new Apple(); //创建对象 |
21 |
$apple->setName("苹果"); |
22 |
echo "创建了一个" . $apple->getName(); |
24 |
echo "MAX_GRADE is " . Apple::MAX_WEIGHT; //静态常量 |
拿侵占公司财物作为例子。这可以用很多方式来完成,取决于是谁来做这种不光彩的事情。例如,一名普通员工可能使用办公室信用卡购买鞋子和电影票,然后在购买单据上写上“办公用品”,而一名主管可能让他的助手通过在线账户系统向他的瑞士银行户头汇款。这两种员工都能完成这个任务,但方式不一样。在这种情况下,接口的目标就是定义侵占公司的一组原则,然后要求各个类分别实现这个接口。例如,接口可能只包括两个方法:
然后可以要求Employee和Executive类实现这些特性。在本节中,我们将学习到这些内容。不过,首先要花点时间理解PHP5是如何实现接口。在PHP中,要这样创建接口:
1 |
interface IinterfaceName |
6 |
function methodName1(); |
8 |
function methodNameN(); |
通常,在接口名前面加上字母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(){ |
6 |
function methodNameN(){ |
实现一个接口
下面给出PHP接口实现的一个实际例子,在此创建并实现了一个名为IPillage的接口,IPillage接口如下:
3 |
function emptyBakAccount(); |
4 |
function burnDocument(); |
然后通过Executive类实现此接口:
01 |
class Executive extends Employee implements IPillage |
03 |
private $totalStockOptions; |
04 |
function emptyBankAccount() |
06 |
echo "Call CFO and ask to transfer funds to Swiss bank account."; |
08 |
function burnDocuments() |
10 |
echo "Torch the office suite."; |
因为公司中所有级别的人都能进行侵占,所以可以有Assistant类实现此接口:
01 |
class Assistant extends Employee implements IPillage |
05 |
echo "Taking memo..."; |
07 |
function emptyBankAccount() |
09 |
echo "Go on shopping spree with office credit card."; |
11 |
function burnDocuments() |
13 |
echo "Start small fire in the trash can."; |
可以看到,接口特别有用。因为,虽然它们定义了发生某一行为需要多少个方法,以及各个方法的名字,但接口允许不同的类,以不同的方式来实现这些方法。在这个例子中,对于烧文件的方法,Assistdnt类只是把文件在垃圾筒里烧掉,而Executive类则通过更过分的方式来做到(将它的办公室烧掉)。
实现多个接口
如果我们允许外来承包商侵占公司是不公平的,毕竟公司是在所有全职员工的努力之下建立的。就是说,怎样为员工提供工作和侵占公司的功能,而限制承包商只能完成所需的任务呢?解决的办法是将这些任务分成几项任务,然后实现必要的多个接口。PHPS 支持这个特性。考虑如下例子:
02 |
interface IEmployee{...} |
03 |
interface IDeveloper{...} |
04 |
interface IPillage{...} |
05 |
class Employee implements IEmployee,IDeveloper,iPillage { |
08 |
class Contractor implements IEmployee,IDeveloper { |
可以看到,员工类可以实现所有3个接口,而承包商类只能实现IEmployee和IDeveloper。
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- 【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- 2016年11月30日 星期三 --出埃及记 Exodus 20:21
2016年11月30日 星期三 --出埃及记 Exodus 20:21 The people remained at a distance, while Moses approached the th ...
- 2016年11月29日 星期二 --出埃及记 Exodus 20:20
2016年11月29日 星期二 --出埃及记 Exodus 20:20 Moses said to the people, "Do not be afraid. God has come t ...
- 2016年11月28日 星期一 --出埃及记 Exodus 20:19
2016年11月28日 星期一 --出埃及记 Exodus 20:19 and said to Moses, "Speak to us yourself and we will listen ...
- 2016年11月27日 星期日 --出埃及记 Exodus 20:18
2016年11月27日 星期日 --出埃及记 Exodus 20:18 When the people saw the thunder and lightning and heard the trum ...
- 2016年11月26日 星期六 --出埃及记 Exodus 20:17
2016年11月26日 星期六 --出埃及记 Exodus 20:17 "You shall not covet your neighbor's house. You shall not c ...
- 2016年11月25日 星期五 --出埃及记 Exodus 20:16
2016年11月25日 星期五 --出埃及记 Exodus 20:16 "You shall not give false testimony against your neighbor.不 ...
- 2016年11月24日 星期四 --出埃及记 Exodus 20:15
2016年11月24日 星期四 --出埃及记 Exodus 20:15 "You shall not steal.不可偷盗.
随机推荐
- net9:图片文件转换成二进制流存入SQL数据库,以及从数据库中读取二进制流输出文件
原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- 【Visual Studio】error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800” (转)
1.案例一 _MSC_VER 定义编译器的版本.下面是一些编译器版本的_MSC_VER值:MS VC++ 10.0 _MSC_VER = 1600MS VC++ 9.0 _MSC_VER = 1500 ...
- js-input file 文件上传(照片,视频,音频)
在此做一个笔记 <input type="file" accept="image/*" capture="camera"> &l ...
- [Inside HotSpot] Java分代堆
[Inside HotSpot] Java分代堆 1. 宇宙初始化 JVM在启动的时候会初始化各种结构,比如模板解释器,类加载器,当然也包括这篇文章的主题,Java堆.在hotspot源码结构中gc/ ...
- Handler处理机制
handler缺点:如果要运送两种类型的数据(比如一个Bitmap,一个Object)就不能运送,但可以用Bunder来传输 * 使用handler的步骤: * 1.创建一个handl ...
- arcgis andriod 加载影像
MapView mMapView;......String rasterPath = Environment.getExternalStorageDirectory().getPath() + &qu ...
- 【IntelliJ idea/My/ecplise】启动项目前,修改配置JVM参数
My/ecplise下都是一样的: IDEA下:
- gulp安装+一个超简单入门小demo
gulp安装參考.gulp安装參考2. 一.NPM npm是node.js的包管理工具.主要功能是管理.更新.搜索.公布node的包. Gulp是通过npm安装的. 所以首先,须要安装node.js. ...
- C#开发ActiveX控件,.NET开发OCX控件案例 【转】
http://xiaochen.2003.4.blog.163.com/blog/static/480409672012530227678/ 讲下什么是ActiveX控件,到底有什么作用?在网页中又如 ...
- java线程中Exchanger使用
有时我们须要对元素进行配对和交换线程的同步点,使用exchange方法 返回其伙伴的对象,这时我们就须要使用线程类中的Exchanger类了, 我通过一个实例 来简单说明一下他的用法及其作用: imp ...