浅谈php接口

之前上学那会学习的专业是C#,工作中的php也在多个项目中,历练成长了不少,不过今天被一个问题问到,php接口,一直知道有这么一个东西存在,但是平时也没有怎么用到过接口,自己也查了下,先记录学习一下,以后有项目能用到那就在好不过

书面定义

接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式,就如面向对象程序设计提供的多重抽象化。接口可能也提供某种意义上的在讲不同语言的实体之间的翻译。人类与电脑等信息机器或人类与程序之间的接口称为用户界面。电脑等信息机器硬件组件间的接口叫硬件接口。电脑等信息机器软件组件间的接口叫软件接口。
接口中定义的所有方法都必须是公有,这是接口的特性。
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

关于interface

 interface是C# 中接口操作的关键字,功能是把所需成员组合起来,以封装一定功能的集合。它好比一个模板,在其中定义了对象必须实现的成员,通过类或结构来实现它。接口不能直接实例化,即ICount ic=new iCount()是错的。接口不能包含成员的任何代码,只定义成员本身。接口成员的具体代码由实现接口的类提供。接口使用interface关键字进行声明。

声明格式

[attributes] [modifiers] interface identifier [: base-list] {interface-body} {;}

使用说明

1、attributes(可选):附加的定义性信息。
2、modifiers(可选): 允许使用的修饰符有 new 和四个访问修饰符。分别是:new、public、protected、internal、 private。在一个接口定义中同一修饰符不允许出现多次,new 修饰符只能出现在嵌套接口中,表示覆盖了继承而来的同名成员。The public, protected, internal, and private 修饰符定义了对接口的访问权限。
3、指示器和事件。
4、identifier:接口名称。
5、base-list(可选):包含一个或多个显式基接口的列表,接口间由逗号分隔。
6、interface-body:对接口成员的定义。
7、接口可以是命名空间或类的成员,并且可以包含下列成员的签名: 方法、属性、索引器 。
8、一个接口可从一个或多个基接口继承。
接口这个概念在C#和Java中非常相似。接口的关键词是interface,一个接口可以扩展一个或者多个其他接口。按照惯例,接口的名字以大写字母"I"开头。

接口实现(implements)

要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
【注意】
    1、实现多个接口时,接口中的方法不能有重名。
    2、接口也可以继承,通过使用 extends 操作符。
    3、类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误。
【常量】
接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。

举个栗子

Example#1 接口示例

[php] view plain copy

  1. <?php  
  2.   
  3. // 声明一个'iTemplate'接口  
  4. interface iTemplate  
  5. {  
  6.     public function setVariable($name$var);  
  7.     public function getHtml($template);  
  8. }  
  9.   
  10.   
  11. // 实现接口  
  12. // 下面的写法是正确的  
  13. class Template implements iTemplate  
  14. {  
  15.     private $vars = array();  
  16.     
  17.     public function setVariable($name$var)  
  18.     {  
  19.         $this->vars[$name] = $var;  
  20.     }  
  21.     
  22.     public function getHtml($template)  
  23.     {  
  24.         foreach($this->vars as $name => $value) {  
  25.             $template = str_replace('{' . $name . '}'$value$template);  
  26.         }  
  27.    
  28.         return $template;  
  29.     }  
  30. }  
  31.   
  32. // 下面的写法是错误的,会报错,因为没有实现 getHtml():  
  33. // Fatal error: Class BadTemplate contains 1 abstract methods  
  34. // and must therefore be declared abstract (iTemplate::getHtml)  
  35. class BadTemplate implements iTemplate  
  36. {  
  37.     private $vars = array();  
  38.     
  39.     public function setVariable($name$var)  
  40.     {  
  41.         $this->vars[$name] = $var;  
  42.     }  
  43. }  
  44. ?>  

Example2 可扩充的接口

[php] view plain copy

  1. <?php  
  2. interface a  
  3. {  
  4.     public function foo();  
  5. }  
  6.   
  7. interface b extends a  
  8. {  
  9.     public function baz(Baz $baz);  
  10. }  
  11.   
  12. // 正确写法  
  13. class c implements b  
  14. {  
  15.     public function foo()  
  16.     {  
  17.     }  
  18.   
  19.     public function baz(Baz $baz)  
  20.     {  
  21.     }  
  22. }  
  23.   
  24. // 错误写法会导致一个致命错误  
  25. class d implements b  
  26. {  
  27.     public function foo()  
  28.     {  
  29.     }  
  30.   
  31.     public function baz(Foo $foo)  
  32.     {  
  33.     }  
  34. }  
  35. ?>  


Example3  继承多个接口

[php] view plain copy

  1. <?php  
  2. interface a  
  3. {  
  4.     public function foo();  
  5. }  
  6.   
  7. interface b  
  8. {  
  9.     public function bar();  
  10. }  
  11.   
  12. interface c extends a, b  
  13. {  
  14.     public function baz();  
  15. }  
  16.   
  17. class d implements c  
  18. {  
  19.     public function foo()  
  20.     {  
  21.     }  
  22.   
  23.     public function bar()  
  24.     {  
  25.     }  
  26.   
  27.     public function baz()  
  28.     {  
  29.     }  
  30. }  
  31. ?>  

Example4 使用接口常量

[php] view plain copy

  1. <?php  
  2. interface a  
  3. {  
  4.     const b = 'Interface constant';  
  5. }  
  6.   
  7. // 输出接口常量  
  8. echo a::b;  
  9.   
  10. // 错误写法,因为常量不能被覆盖。接口常量的概念和类常量是一样的。  
  11. class b implements a  
  12. {  
  13.     const b = 'Class constant';  
  14. }  
  15. ?>  


案例

[php] view plain copy

  1. <?php  
  2.   
  3. /** 
  4. * An example of duck typing in PHP 
  5. */  
  6.   
  7. interface CanFly {  
  8.   public function fly();  
  9. }  
  10.   
  11. interface CanSwim {  
  12.   public function swim();  
  13. }  
  14.   
  15. class Bird {  
  16.   public function info() {  
  17.     echo "I am a {$this->name}\n";  
  18.     echo "I am an bird\n";  
  19.   }  
  20. }  
  21.   
  22. /** 
  23. * some implementations of birds 
  24. */  
  25. class Dove extends Bird implements CanFly {  
  26.   var $name = "Dove";  
  27.   public function fly() {  
  28.     echo "I fly\n";  
  29.   }   
  30. }  
  31.   
  32. class Penguin extends Bird implements CanSwim {  
  33.   var $name = "Penguin";  
  34.   public function swim() {  
  35.     echo "I swim\n";  
  36.   }   
  37. }  
  38.   
  39. class Duck extends Bird implements CanFly, CanSwim {  
  40.   var $name = "Duck";  
  41.   public function fly() {  
  42.     echo "I fly\n";  
  43.   }  
  44.   public function swim() {  
  45.     echo "I swim\n";  
  46.   }  
  47. }  
  48.   
  49. /** 
  50. * a simple function to describe a bird 
  51. */  
  52. function describe($bird) {  
  53.   if ($bird instanceof Bird) {  
  54.     $bird->info();  
  55.     if ($bird instanceof CanFly) {  
  56.       $bird->fly();  
  57.     }  
  58.     if ($bird instanceof CanSwim) {  
  59.       $bird->swim();  
  60.     }  
  61.   } else {  
  62.     die("This is not a bird. I cannot describe it.");  
  63.   }  
  64. }  
  65.   
  66. // describe these birds please  
  67. describe(new Penguin);  
  68. echo "---\n";  
  69.   
  70. describe(new Dove);  
  71. echo "---\n";  
  72.   
  73. describe(new Duck);  
  74.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值