详细解读PHP中接口的应用


Posted in PHP onAugust 12, 2015

接口
PHP类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此PHP引入了接口技术

如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有的成员都是public权限的,那么这种特殊的抽象类就叫接口

接口使用interface关键字定义,并使用implements来实现接口的方法,且必须完全实现

实现一个接口

下面给出PHP接口实现的一个实际例子,在此创建并实现了一个名为IPillage的接口,IPillage接口如下:

interface IPillage
{
 function emptyBakAccount();
 function burnDocument();
}

然后通过Executive类实现此接口:

class Executive extends Employee implements IPillage
{
 private $totalStockOptions;
 function emptyBankAccount()
 {
  echo "Call CFO and ask to transfer funds to Swiss bank account.";
 }
 function burnDocuments()
 {
  echo "Torch the office suite.";
 }
}

因为公司中所有级别的人都能进行侵占,所以可以有Assistant类实现此接口:

class Assistant extends Employee implements IPillage
{
 function takeMome()
 {
  echo "Taking memo...";
 }
 function emptyBankAccount()
 {
  echo "Go on shopping spree with office credit card.";
 }
 function burnDocuments()
 {
  echo "Start small fire in the trash can.";
 }
}

可以看到,接口特别有用。因为,虽然它们定义了发生某一行为需要多少个方法,以及各个方法的名字,但接口允许不同的类,以不同的方式来实现这些方法。在这个例子中,对于烧文件的方法,Assistdnt类只是把文件在垃圾筒里烧掉,而Executive类则通过更过分的方式来做到(将它的办公室烧掉)。

实现多个接口

如果我们允许外来承包商侵占公司是不公平的,毕竟公司是在所有全职员工的努力之下建立的。就是说,怎样为员工提供工作和侵占公司的功能,而限制承包商只能完成所需的任务呢?解决的办法是将这些任务分成几项任务,然后实现必要的多个接口。PHPS 支持这个特性。考虑如下例子:

<?php
 interface IEmployee{...}
 interface IDeveloper{...}
 interface IPillage{...}
 class Employee implements IEmployee,IDeveloper,iPillage {
 ...
 }
 class Contractor implements IEmployee,IDeveloper {
 ...
 }
?>

抽象类和接口的区别
接口是一个特殊的抽象类,也可以看作是一个模型的规范。接口与抽象类大致区别如下:

    一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果继承一个抽象类,只需要实现需要的方法即可
    如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已
    抽象类只能单继承,当一个子类需要实现的功能需要继承多个父类时,就必须使用接口


代码示例

<?php 
  
 /** 
  * 声明接口Demo 
  * @author wzy 
  * 
  */ 
 interface Demo 
 { 
  
  const NAME = "wangzhengyi"; 
  
  const AGE = 25; 
  
  function fun1 (); // 声明方法默认是public abstract 
  function fun2 (); 
 } 
  
 /** 
  * 声明接口的继承Demo2 
  * 
  * @author wzy 
  *   
  */ 
 interface Demo2 extends Demo 
 { 
  
  function fun3 (); 
  
  function fun4 (); 
 } 
  
 /** 
  * 声明接口Demo3 
  * 
  * @author wzy 
  *   
  */ 
 interface Demo3 
 { 
  
  function fun5 (); 
  
  function fun6 (); 
 } 
  
 /** 
  * 声明父类ParentClass 
  * 
  * @author wzy 
  *   
  */ 
 class ParentClass 
 { 
  
  function fun7 (); 
 } 
  
 /** 
  * 子类必须实现接口中所有的方法 
  * 
  * @author wzy 
  *   
  */ 
 class ChildClass extends ParentClass implements Demo2, Demo3 
 { 
  
  function fun1 (); 
  
  function fun2 (); 
  
  function fun3 (); 
  
  function fun4 (); 
  
  function fun5 (); 
  
  function fun6 (); 
 }
PHP 相关文章推荐
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
Jun 27 PHP
8个PHP数组面试题
Jun 23 PHP
php使用curl通过代理获取数据的实现方法
May 16 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
php学习笔记之mb_strstr的基本使用
Feb 03 PHP
PDO::rollBack讲解
Jan 29 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 PHP
举例讲解PHP面对对象编程的多态
Aug 12 #PHP
详解PHP中的状态模式编程
Aug 11 #PHP
简单介绍PHP的责任链编程模式
Aug 11 #PHP
PHP会话处理的10个函数
Aug 11 #PHP
PHP的Socket网络编程入门指引
Aug 11 #PHP
php实现的农历算法实例
Aug 11 #PHP
PHP发送短信代码分享
Aug 11 #PHP
You might like
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
浅析php header 跳转
2013/06/17 PHP
简单谈谈php中的unicode和utf8编码
2015/06/10 PHP
twig模板常用语句实例小结
2016/02/04 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
jquery插件之easing使用
2010/08/19 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
在Python程序中实现分布式进程的教程
2015/04/28 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
使用python绘制温度变化雷达图
2019/10/18 Python
Python3常见函数range()用法详解
2019/12/30 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
Python中无限循环需要什么条件
2020/05/27 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
几道PHP的面试题
2012/05/19 面试题
初中三年学生的学习自我评价
2013/11/13 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
诚信贷款承诺书
2014/05/30 职场文书
就业意向协议书
2015/01/29 职场文书
公司介绍信范文
2015/01/31 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS