当前位置:首页 > PHP教程 > php高级应用 > 列表

php中的接口与抽象类及接口与抽象类的区别

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-17 09:45:22 浏览: 评论:0 

在php中接口抽象类、Final、Static几个我们用到的相当的简单特别是大型网站架构时都会有用到了,今天我们来看一篇关于php中抽象类、Final、Static的例子。

1. 接口

(1)对接口的使用是通过关键字implements

(2)接口不能定义成员变量(包括类静态变量),能定义常量

(3)子类必须实现接口定义的所有方法

(4)接口只能定义不能实现该方法

(5)接口没有构造函数

(6)接口中的方法和实现它的类默认都是public类型的

2. 抽象类

(1)对抽象类的使用是通过关键字extends

(2)不能被实例化,可以定义子类必须实现的方法

(3)子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类中一样(或者更为宽松)

(4)如一个类中有一个抽象方法,则该类必须定义为抽象类

(5)抽象类可以有构造函数

(6)抽象类中的方法可以使用private,protected,public来修饰。

(7)一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

3. Final类/方法

(1)final类不能被继承

(2)final方法不能被重写

4. Static类/方法

(1)可以不实例化类而直接访问

(2)静态属性不可以由对象通过->操作符来访问,用::方式调用

  1. <?php  
  2.  
  3. # 接口 
  4.  
  5. interface Human{  
  6.  
  7.     const TEST_CONST = "test const"// 定义常量 
  8.  
  9.     // public $v; // error,不能定义变量  
  10.  
  11.     // static $count; // error,不能定义变量  
  12.  
  13.     public function speak();  
  14.  
  15.     public function walk();  
  16.  
  17.     public function run();  
  18.  
  19. }  
  20.  
  21. # 抽象类 
  22.  
  23. abstract class Father implements Human{ 
  24.  
  25.     public function construct(){  
  26.  
  27.         echo "father init n";  
  28.  
  29.     } 
  30.  
  31.     abstract public function walk(); // 抽象方法 
  32.  
  33.     public function speak(){  
  34.  
  35.         echo "father speak skill n"
  36.  
  37.     } 
  38.  
  39.     public function run(){ 
  40.  
  41.         echo "father run skill n";  
  42.  
  43.     } 
  44.  
  45. }  
  46.  
  47. # 非抽象类 
  48.  
  49. class Mother implements Human{ 
  50.  
  51.     public function construct(){ 
  52.  
  53.         echo "mother init n"
  54.  
  55.     } 
  56.  
  57.     # 这里必须实现walk方法  
  58.  
  59.     public function walk(){  
  60.  
  61.         echo "mother walk skill n";  
  62.  
  63.     } 
  64.  
  65.     public function speak(){ 
  66.  
  67.          echo "mother speak skill n";  
  68.  
  69.     } 
  70.  
  71.     public function run(){  
  72.  
  73.         echo "mother run skill n";  
  74.  
  75.     }  
  76.  
  77.  
  78. class Son extends Father{  
  79.  
  80.     public function walk(){ 
  81.  
  82.          echo "son walk skill. n";  
  83.  
  84.     } 
  85.  
  86.     public function speak($name = ''){ 
  87.  
  88.          echo "son: "$name ." speak skill. n";  
  89.  
  90.     } 
  91.  
  92.     # 访问控制必须和父类中一样(或者更为宽松)  
  93.  
  94.     protected function sport(){  
  95.  
  96.         echo "son sport skill. n";  
  97.  
  98.     } 
  99.  
  100.     final public function notTeach(){  
  101.  
  102.         echo 'son has not to teach skill';  
  103.  
  104.     }  
  105.  
  106.  
  107.    
  108.  
  109. class Daughter extends Mother{ 
  110.  
  111.     public function run($name = ''){  
  112.  
  113.         echo "daughter run skill. n";  
  114.  
  115.     } 
  116.  
  117.  
  118. final class GrandChild extends Son{ 
  119.  
  120.     # 访问控制必须和父类中一样(或者更为宽松)  
  121.  
  122.     public function sport(){  
  123.  
  124.         echo "GrandChild sport skill. n";  
  125.  
  126.     } 
  127.  
  128.     # Cannot override final method Son::notTeach()  
  129.  
  130.     // public function notTeach(){} // error  
  131.  
  132.  
  133.    
  134.  
  135. #  Class Orphan may not inherit from final class (GrandChild)  
  136.  
  137. // class Orphan extends GrandChild{}  // error 
  138.  
  139. $son = new Son();  
  140.  
  141. $son->speak("Suly");  
  142.  
  143. $daughter = new Daughter();  
  144.  
  145. $daughter->run('Lily'); 
  146.  
  147. $grandChild = new GrandChild(); 
  148.  
  149. $grandChild->sport(); 

抽象类和接口的区别

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。

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

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

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

5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

抽象类还是接口

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

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

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

Tags: php接口 php抽象类

分享到: