详细解读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 相关文章推荐
在PHP3中实现SESSION的功能(三)
Oct 09 PHP
PHP动态变静态原理
Nov 25 PHP
实用函数2
Nov 08 PHP
PHP的异常处理类Exception的使用及说明
Jun 13 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
php数组查找函数总结
Nov 18 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
PHP的时间戳与具体时间转化的简单实现
Jun 13 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
PHP INT类型在内存中占字节详解
Jul 20 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中使用Oracle数据库(4)
2006/10/09 PHP
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
php fckeditor 调用的函数
2009/06/21 PHP
使用php来实现网络服务
2009/09/15 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
php数组去重复数据示例
2014/02/25 PHP
php实现的ping端口函数实例
2014/11/12 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
python 常用的基础函数
2018/07/10 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
Python数组并集交集补集代码实例
2020/02/18 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
python线程里哪种模块比较适合
2020/08/02 Python
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
如何选择使用结构还是类
2014/05/30 面试题
心理学专业毕业生推荐信范文
2013/11/21 职场文书
中小企业员工手册范本
2015/05/14 职场文书
关于五一放假的通知
2015/08/18 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技