PHP中抽象类和接口的区别与例子

四月 16, 2019 | views
Comments 0

PHP中抽象类和接口在应用中会有什么区别呢,对于这个问题我们一起来给各位介绍PHP中抽象类和接口区别及它的例子,具体的细节如下。

PHP中抽象类和接口区别:

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以用extends继承。abstract 关键字来定义个一个抽象类或者抽象方法。抽象类不能被实例化。

2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另JAVA接口中的成员变量都要声明为public static final类型).抽象类中可以有成员属性和成员方法,而接口中只能有未实现的方法和常量。

3、接口没有构造函数,抽象类可以有构造函数。(抽象类中可以有非抽象的方法,而接口中只能够有抽象的方法!)

4、抽象类只允许单继承,而接口可以多继承

5。在写法上

一、接口中的抽象方法前不用也不能加abstract关键字,默认隐式就是抽象方法,也不能加final关键字来防止抽象方法的继承.而抽象类中抽象方法前则必须加上abstract表示

显示声明为抽象方法.

二、接口中的抽象方法默认是public的,也只能是public的,不能用private、protected修饰符修饰.而抽象类则可以。

抽象类还是接口:

如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建由一些不相关对象采用的功能,就使用接口。

如果必须从多个来源继承行为,就使用接口。

如果知道所有类都会共享一个公共的行为实现,就可以使用抽象类,并在其中实现该行为.

  1. Explain: 
  2.  
  3. abstract class Father { 
  4.     function meth1() { 
  5.         echo "meth1...<br>"
  6.     } 
  7.     abstract function meth2(); 
  8.     public $var1="var1"
  9.     public static $var2="var2"
  10.     const Var3="Var3"
  11. class Son extends Father { 
  12.     function meth2() { 
  13.         echo "meth2 of Son...<br>"
  14.     } 
  15. $s=new Son(); 
  16. echo $s->var1."<br>"
  17. echo Father::$var2."<br>"
  18. echo Father::Var3."<br>"
  19.  
  20. Interface IFather { 
  21.     //public $iVar1="iVar1";         此处接口定义中不能包含成员变量 
  22.     //public static $iVar2="iVar2";  此处接口定义中不能包含静态变量 
  23.     const iVar3="iVar3"
  24.     function iMeth1(); 
  25. Class ISon implements IFather { 
  26.     function iMeth1() { 
  27.         echo "iMeth1...<br>"
  28.     } 
  29. $is=new ISon(); 
  30. echo IFather::iVar3; 
  31. //抽象类的定义: 
  32. abstract class ku{  //定义一个抽象类 
  33.   abstract function kx(); 
  34.   ...... 
  35. function aa extends ku{ 
  36.   //实现抽象类的方法 
  37.  
  38.   function kx(){ 
  39.     echo 
  40. 'sdsf'
  41.   } 
  42. //使用方法 
  43. $aa=new aa; 
  44. $aa->kx(); 
  45. //1.定义一些方法,子类必须完全实现这个抽象中所有的方法 
  46. //2.不能从抽象类创建对象,它的意义在于被扩展 
  47. //3.抽象类通常具有抽象方法,方法中没有大括号 
  48. //4.抽象方法不必实现具体的功能,由子类来完成 
  49. //5.在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义 
  50. //6.抽象类的方法可以有参数,也可以为空 
  51. //7.如果抽象方法有参数,那么子类的实现也必须有相同的参数个数 
  52. //////////////////////////////接口类的定义: 
  53. interface Shop{ 
  54.       public function buy($gid); 
  55.       public function sell($gid); 
  56.       abstract function view($gid); 
  57. //如果要使用接口,必须定义接口类中的所以方法少一个都不可以(abstract除外)。 
  58. //这样如果在一个大项目中不管别人怎么去做下面的方法,但是他必须实现本接口中的所有方法才可以! 
  59. //例:实现上面的接口的一种方法 
  60. class BaseShop implements Shop{ 
  61.     public function buy($gid){ 
  62.   echo '你购买了ID为 :' . $gid . '的商品'
  63.     } 
  64.     public function sell($gid){ 
  65.   echo '你购卖ID为 :' . $gid . '的商品'
  66.     } 
  67.     public function view($gid){ 
  68.         echo '你浏览了ID为 :' . $gid . '的商品'
  69.     } 
  70. //接口的多重继承示例: 
  71. interface staff_i1{ //接口1 
  72.   function setID(); 
  73.   function getID(); 
  74. interface staff_i2{ //接口2 
  75.   function setName(); 
  76.   function getName(); 
  77.  
  78. class staff implements staff_i1,staff_i2{ 
  79.   private $id
  80.   private $name
  81.   function setID($id){ 
  82.   $this->id = $id
  83.  } 
  84.     function getID(){ 
  85.   return $this->id; 
  86.     } 
  87.  
  88.     function setName($name){ 
  89.   $this->name = $name
  90.     } //phpfensi.com 
  91.  
  92.     function getName(){ 
  93.   return $this->name; 
  94.     } 
  95.  
  96.     function otherFunc(){ //这是一个接口中不存在的方法 
  97.   echo 'Test'
  98.    } 

总结:

在学习PHP面向对象时,都会在抽象类与接口上迷惑,作用差不多为什么还那么容易混淆,何不留一去一?但是事实上两者的区别还是很大的,如果能够很好地运用PHP的两个方法,面向对象的程序设计将会更加合理、清晰高效。

对接口的使用方式是通过关键字implements来实现的,而对于抽象类的操作是使用类继承的关键字exotends实现的,使用时要特别注意。

接口没有数据成员,但是抽象类有数据成员,抽象类可以实现数据的封装。

接口没有构造函数,抽象类可以有构造函数。

接口中的方法都是public类型,而抽象类中的方法可以使用private、protected或public来修饰。

一个类可以同时实现多个接口,但是只能实现一个抽象类。
 
相同点:函数体内不能写任何东西,连两个大括号都不能写!!!如:function getName();这样就行了



zend