• 微信号
目录

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();
?>

运行结果

陵小宇博-php抽象类

定义一个抽象类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中类是单继承的,但一个类却可以实现多个接口,并且这些接口之间用逗号分隔开

案例

<?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();
?>

运行结果

陵小宇博-php接口