首页 > 开发 > PHP > 正文

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

2024-05-04 22:00:34
字体:大 中 小
来源:转载
供稿:网友

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

总结:

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

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

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

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

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表