当前位置:首页 > PHP教程 > php面向对象 > 列表

详细解读PHP中接口的应用

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-16 11:17:11 浏览: 评论:0 

这篇文章主要介绍了PHP中接口的应用,是PHP入门学习中的基础知识,需要的朋友可以参考下。

接口

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

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

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

实现一个接口

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

  1. interface IPillage 
  2.  function emptyBakAccount(); 
  3.  function burnDocument(); 

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

  1. class Executive extends Employee implements IPillage 
  2.  private $totalStockOptions
  3.  function emptyBankAccount() 
  4.  { 
  5.   echo "Call CFO and ask to transfer funds to Swiss bank account."
  6.  } 
  7.  function burnDocuments() 
  8.  { 
  9.   echo "Torch the office suite."
  10.  } 

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

  1. class Assistant extends Employee implements IPillage 
  2.  function takeMome() 
  3.  { 
  4.   echo "Taking memo..."
  5.  } 
  6.  function emptyBankAccount() 
  7.  { 
  8.   echo "Go on shopping spree with office credit card."
  9.  } 
  10.  function burnDocuments() 
  11.  { 
  12.   echo "Start small fire in the trash can."
  13.  } 

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

实现多个接口

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

  1. <?php 
  2.  interface IEmployee{...} 
  3.  interface IDeveloper{...} 
  4.  interface IPillage{...} 
  5.  class Employee implements IEmployee,IDeveloper,iPillage { 
  6.  ... 
  7.  } 
  8.  class Contractor implements IEmployee,IDeveloper { 
  9.  ... 
  10.  } 
  11. ?> 

抽象类和接口的区别

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

一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果继承一个抽象类,只需要实现需要的方法即可

如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已

抽象类只能单继承,当一个子类需要实现的功能需要继承多个父类时,就必须使用接口

代码示例:

  1. <?php  
  2.    
  3. /**  
  4.  * 声明接口Demo  
  5.  * @author wzy  
  6.  *  
  7.  */ 
  8. interface Demo  
  9. {  
  10.    
  11.  const NAME = "wangzhengyi";  
  12.    
  13.  const AGE = 25;  
  14.    
  15.  function fun1 (); // 声明方法默认是public abstract  
  16.  function fun2 ();  
  17. }  
  18.    
  19. /**  
  20.  * 声明接口的继承Demo2  
  21.  *  
  22.  * @author wzy  
  23.  *    
  24.  */ 
  25. interface Demo2 extends Demo  
  26. {  
  27.    
  28.  function fun3 ();  
  29.    
  30.  function fun4 ();  
  31. }  
  32.    
  33. /**  
  34.  * 声明接口Demo3  
  35.  *  
  36.  * @author wzy  
  37.  *    
  38.  */ 
  39. interface Demo3  
  40. {  
  41.    
  42.  function fun5 ();  
  43.    
  44.  function fun6 ();  
  45. }  
  46.    
  47. /**  
  48.  * 声明父类ParentClass  
  49.  *  
  50.  * @author wzy  
  51.  *    
  52.  */ 
  53. class ParentClass  
  54. {  
  55.    
  56.  function fun7 ();  
  57. }  
  58.    
  59. /**  
  60.  * 子类必须实现接口中所有的方法  
  61.  *  
  62.  * @author wzy  
  63.  *    
  64.  */ 
  65. class ChildClass extends ParentClass implements Demo2, Demo3  
  66. {  
  67.    
  68.  function fun1 ();  
  69.    
  70.  function fun2 ();  
  71.    
  72.  function fun3 ();  
  73.    
  74.  function fun4 ();  
  75.    
  76.  function fun5 ();  
  77.    
  78.  function fun6 ();  
  79. }

Tags: PHP接口应用

分享到: