• 微信号
  • 微信号
目录

PHP基础

您当前的位置:首页 > 我的笔记 > PHP基础>抽象类与接口

抽象类与接口

当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的,此时就可以使用抽象类和接口。抽象类和接口用于*程序灵活性,抽象类是一个特殊的类,而接口又是一种特殊的抽象类。

抽象类

当定义一个类的时候,其中所需要的某些方法暂时不能*定义出来,而是让其继承的类实现,此时就可以用到抽象类。比如,定义一个动物类,每种动物有一个叫的方法。而每种动物叫法不同,因此可以将动物的定义为一个抽象类。

定义抽象类需要使用abstract关键字来修饰,语法格式具体如下

abstract class 类名{ 
 //类成员 
}

由于每种动物叫的方式不同,所以需要将动物的shout()方法定位成抽象,即只有方法声明而没有方法体的方法,在子类继承时在来编写该方法的具体实现,这种特殊的方法称为抽象方法,其语法格式如下

abstract function 方法名();

案例

<?php 
 //使用abstract关键字声明一个抽象类 
 abstract class animal{ 
 //在抽象类中声明抽象方法 
 abstract public function shout(); 
 } 
 //定义dog类继承自animal类 
 class dog extends animal{ 
 //实现抽象方法shout() 
 public function shout(){ 
 echo "dog叫:汪汪……<br>"; 
 } 
 } 
 //定义cat类继承自animal类 
 class cat extends animal{ 
 public function shout(){ 
 echo "cat叫:喵喵……<br>"; 
 } 
 } 
 $dog1=new dog(); 
 $dog1->shout(); 
 $cat1=new cat(); 
 $cat1->shout(); 
?>

运行结果

定义一个抽象类animal,然后使dog类和cat类继承animal类并实现抽象方法shout(),*后调用cat对象和dog对象的shout()方法,输出不同的叫声

注意:

  • 抽象类不能被实例化
  • 抽象类可以没有抽象方法,但有抽象方法的抽象类才有意义,一但类包含了抽象方法,则这个类必须声明abstract
  • 抽象类中可以有非抽象方法、成员属性和常量
  • 抽象方法不能有函数体,它只能存在于抽象类中
  • 如果一个类继承了某个抽象类,则它必须实现该抽象的所有抽象方法,除非它自己也声明为抽象类

接口

如果一个抽象类中的所有的方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。在定义接口时,需要使用interface关键字,具体代码如下

interface animal{ 
 public function run(); 
 public function breathe(); 
}

定义接口与定一个标准的类相似,但其中定义的所有方法都是空的。需要注意的是接口中的所有方法都是公有的,也不能使用final关键字来修饰

由于接口定义的都是抽象方法,没有具体实现,需要通过类来实现接口,接口使用implements关键字

案例

<?php 
//定义animal类 
 interface animal{ 
 public function run(); 
 public function shout(); 
 } 
 //定义dog类,实现了animal接口 
 class dog implements animal{ 
 public function run(){ 
 echo "狗在奔跑<br>"; 
 } 
 public function shout(){ 
 echo "汪汪……<br>"; 
 } 
 } 
 //定义cat类实现animal接口 
 class cat implements animal{ 
 public function run(){ 
 echo "猫在跳<br>"; 
 } 
 public function shout(){ 
 echo "喵喵……<br>"; 
 } 
 } 
 $cat1=new cat(); 
 $cat1->run(); 
 $cat1->shout(); 
 $dog1=new dog(); 
 $dog1->run(); 
 $dog1->shout(); 
?>

运行结果

在PHP中类是单继承的,但一个类却可以实现多个接口,并且这些接口之间用逗号分隔开

案例

<?php 
 //定义animal接口 
 interface animal{ 
 public function run(); 
 public function shout(); 
 } 
 //定义LandAnimal接口 
 interface LandAnimal{ 
 public function LifeLand(); 
 } 
 class dog implements animal,LandAnimal{ 
 public function LifeLand(){ 
 echo"狗生活在陆地上<br>"; 
 } 
 public function run(){ 
 echo "狗在奔跑<br>"; 
 } 
 public function shout(){ 
 echo "汪汪……<br>"; 
 } 
 } 
 $dog1=new dog(); 
 $dog1->LifeLand(); 
 $dog1->run(); 
 $dog1->shout(); 
?>

运行结果