<转>PHP面向对象——接口和多态性

前言

今天查看本科生c++试卷的时候,发现还是有同学学习过c++之后,却对面向对象的3大特性都不了解,这里用php解释一下接口和多态性,也当作是一种自我学习吧

惭愧,博主笔试新浪php工程师,竟然不知道面向对象的5原则,这里好好记录一下


面向对象5原则


单一职责原则(single-resposibility principle)

其核心思想为:一个类,最好只做一件事,只有一个引起它的变化的原因

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。测试驱动的开发实践常常会在设计出现臭味之前就迫使我们分离职责

开放-封闭原则(The Open-Close principle)

其核心思想为:对扩展开放,对修改封闭

软件实体(类、模块、函数)应该是可扩展的,但是不可修改的。也就是说,对于扩展是开放的,对于更改是封闭的。怎样可能在不改动模块源代码的情 况下去更改它的行为呢?怎样才能在无需对模块进行改动的情况下改变它的功能呢?关键是抽象!因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和 多态技术。该原则同样适合于非面向对象的方法,是软件工程设计方法的重要原则之一

Liskov 替换原则(liskov-substitution principle)

其核心思想:子类必须能够替换其基类

子类应当可以替换父类出现在父类能够出现的任何地方

依赖倒置原则(dependency-inversion principle)

其核心思想:依赖于抽象

1、高层模块不应该依赖于低层模块,二者都应该依赖于抽象。2、抽象不应该依赖于细节。细节应该依赖于抽象。在进行业务设计时,于特定业务有关 的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。

接口分离原则(interface-segregation principle)

其核心思想:使用多个小的专门的接口,而不要使用一个大的总接口

具体而言,接口隔离原则体现在:接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染


接口

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

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

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

抽象类和接口的区别

接口是一个特殊的抽象类,也可以看作是一个模型的规范。接口与抽象类大致区别如下:
  1. 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果继承一个抽象类,只需要实现需要的方法即可
  2. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已
  3. 抽象类只能单继承,当一个子类需要实现的功能需要继承多个父类时,就必须使用接口

代码示例

  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. }  


多态性

多态性是面向对象设计的重要特性,它展现了动态绑定(dynamic binding)的功能,也成为“同名异式”。多态的功能可以让软件在开发和维护时,达到充分的延伸性(extension)

通俗理解

多态最直接的定义就是让具有继承关系的不同类对象,可以对相同名称的成员函数调用,产生不同的反应结果

多态的代码

  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. class One implements Demo  
  20. {  
  21.   
  22.     public function fun1 ()  
  23.     {  
  24.         echo Demo::NAME . "就读于中国传媒大学";  
  25.     }  
  26.   
  27.     public function fun2 ()  
  28.     {  
  29.         echo Demo::NAME . "的年龄是" . Demo::AGE;  
  30.     }  
  31. }  
  32.   
  33. class Two implements Demo  
  34. {  
  35.   
  36.     public function fun1 ()  
  37.     {  
  38.         echo Demo::NAME . "在北京灵创众和科技有限公司实习中";  
  39.     }  
  40.   
  41.     public function fun2 ()  
  42.     {  
  43.         echo Demo::NAME . "去年的年龄是24";  
  44.     }  
  45. }  
  46.   
  47. // 同一个接口,实现同一个方法,不同的对象,反应结果不同。这就是多态的表现和应用  
  48.   
  49. $one = new One();  
  50. $one->fun1(); // wangzhengyi就读于中国传媒大学  
  51. $one->fun2(); // wangzhengyi的年龄是25  
  52.   
  53. echo "<br>";  
  54.   
  55. $two = new Two();  
  56. $two->fun1(); // wangzhengyi在北京灵创众和科技有限公司实习中  
  57. $two->fun2(); // wangzhengyi去年的年龄是24 

posted on 2015-10-03 10:28  hahahahahai12  阅读(134)  评论(0)    收藏  举报

导航