【web 开发】快来给你的类定个标准 -PHP 的接口技术(64)

举报
迷彩 发表于 2023/07/24 10:36:37 2023/07/24
【摘要】 前言因为php和Java一样,只支持单继承,即是每个类只能继承自一个父类。这就跟现实生活非常贴切,从生理学上来说,一个人只有一个父亲。当声明的心类继承抽象类实现模板以后,他就不能再有其他父类了。为了解决这个问题,php引入了接口的概念。接口是一种特殊的抽象类,这个在上一篇文章也介绍过。而抽象类又是一种特殊的类,所以接口也是一种特殊的类。这样关联起来,更有利于对抽象类和接口的理解。如果抽象类中...

前言

因为php和Java一样,只支持单继承,即是每个类只能继承自一个父类。这就跟现实生活非常贴切,从生理学上来说,一个人只有一个父亲。当声明的心类继承抽象类实现模板以后,他就不能再有其他父类了。为了解决这个问题,php引入了接口的概念。接口是一种特殊的抽象类,这个在上一篇文章也介绍过。而抽象类又是一种特殊的类,所以接口也是一种特殊的类。这样关联起来,更有利于对抽象类和接口的理解。如果抽象类中的所有方法都是抽象方法,那么我们就可以换另一种声明方式--使用接口技术.


接口的声明及使用


接口中声明的方法必须都是抽象方法,另外不能在接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中的所有成员都必须有public的访问权限。类的声明时使用class关键字标识的,而接口的声明则是使用interface关键字来修饰。声明接口的语法格式如下:

interface 接口名称{//interface是修饰关键字
	//常量成员属性
	//抽象方法--接口所有的方法必须是抽象方法,不能有非抽象方法
}

接口中所有的方法都要求是抽象方法,所以就不需要在方法名前面使用abstract关键字修饰了,而且在接口中也不需要显式的使用public访问权限进行修饰,因为默认权限就是public的,也只能使public的。另外接口和抽象类一样也不能实例化对象,它是一种更加严格的规范,也需要通过子类来实现。但可以直接使用接口名称在接口外面去获取常量成员的值,下面通过一个例子来介绍接口的声明:

声明一个名称为One的接口

<?php
interface One{
	const CHANGLIANG = '常量';  //声明常量成员属性
	function func1();
	function func2();
}

还可以使用extends关键字让一个接口去继承另外一个接口,实现接口之间的扩展,因为代码需要降低耦合度,但很多时候又需要多个标准组合,也就是需要同时满足多个标准,所以接口可以分为更小的粒度进行声明,在下面的例子中声明了一个Two接口继承了前面例子的One接口,具体代码如下:

<?php
interface Two extends One{ //继承接口One
	
	function func3();
	function func4();
}


如果需要使用接口中的成员,则需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。但通过类去继承接口时需要使用implements关键字来实现,而不是使用extends关键字来完成。如果需要使用抽象类去实现接口中的部分方法,也同样需要使用implements关键字实现。在下面的例子中声明一个抽象类Myclass去实现One接口中的部分方法,但是要想实例化对象,这个抽象类还要有子类把它所有的抽象方法都实现才行。声明一个Myclass2类去实现One接口中的全部方法。具体代码如下:

<?php
interface One{
	const CHANGLIANG = '常量';  //声明常量成员属性
	function func1();
	function func2();
}

abstract class Myclass implements One{
	function func1(){ //只实现了抽象方法func1
		//todo
		
	}
}

class Myclass2 implements One{
	//实现接口中的所有抽象方法
	function func1(){ 
		//todo
		
	}
	
	function func2(){ 
		//todo
		
	}
}


php是单继承的,一个类只能有一个父类,但是一个类可以实现多个接口.将要实现的 多个接口之间使用逗号分隔开来,而且子类中需要将所有接口中的抽象方法全部实现才可以创建对象.相当于一个类要遵守多个规范,就像我们不仅要遵守国家法律,如果在学校,作为学生还要遵守学校的规章制度.实现多个接口的格式的代码如下:

<?php
class  ClassName implements 接口1,接口2,接口3,....,接口n{
    //todo需要实现所有接口中的所有抽象方法
}

实现多个接口使用implements关键字,同时还可以使用extends关键字继承一个类,即在继承一个类的同时实现多个接口。但一定要先使用extends继承一个类,再使用implements关键字实现多个接口,代码语法格式如下:

<?php
//继承一个类以及实现多个接口
class  ClassName extends SuperClassName(父类) implements 接口1,接口2,接口3,....,接口n{
    //todo需要实现所有接口中的所有抽象方法
}

除了上述的一些应用,还有很多地方可以使用接口,比如:对于一些已经开发好的系统,在结构上进行较大的调整已经不太现实,这时可以通过定义一些接口并追加相应的实现来完成功能结构的扩展。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。