什么是接口?
先来看抽象类:抽象类是不能被实例化的类,任何一个类,如果它里面至少有一个方法被声明为抽象的,那么这个类就必须被声明为抽象的。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
(当然抽象类中也可以没有抽象方法,但是含有抽象方法的类必须被定义为抽象类)。
如:abstract class 类名{
属性1;
属性2;
非抽象方法(){}
抽象方法1();
抽象方法2();
}
设想一下,将上述抽象类中的“实在的成员”删除,即删除那些非抽象的成员,那么该抽象类中就只有抽象方法:
如:abstract class 类名{
抽象方法1();
抽象方法2();
}
由此,可以理解为:这个类“太抽象了”,几乎自己什么都没做,就是让别人来做;
那么:接口就与这个“太抽象的类”类似;
接口,就是规定,里面只能放“抽象方法”和“常量”的一种类似类的结构体;
因此,接口是“比抽象类更抽象的”一种语法。
接口的定义形式(interface):
如:interface 接口名{
常量1;
常量2;
...........
抽象方法1;
抽象方法2;
...........
}
说明:1.可见接口中只有“常量”和“抽象方法”两种成员;
2.接口常量的使用形式为:接口名::常量名称;
3.接口中的抽象方法不要使用abstract修饰,也不需要使用访问控制符修饰,因为其天然就是public修饰;
例:interface A{
const PI = 3.14;
const CC1 = 1 ;
function Show1();//抽象方法,无形参
function Func2($p1,$p2);//抽象方法,2个形参
}
为什么需要接口?
面向对象的编程思想是对“现实世界”的描述,而现实世界往往是多继承关系;
但:
出于降低类与类之间的关系的复杂度的考虑,将PHP语言设计为单继承的;但这样就无法表达出现实世界的多继承特性;
所以:
接口就是对没有多继承的类之间关系的一个补充;因为接口可以实现“多继承”,只是此时不称为“继承”而是称为“实现”而已;
即:接口1——》类1;
就称为:类1实现的接口1;
其本质:是类1中有了接口1中的“特征信息”;
例:
<?php /*定义Player接口 *接口中的抽象方法不要使用abstract修饰,也不需要使用访问控制符修饰,因为其天然就是public修饰; * */ interface Player{ function play(); function stop(); function next(); function prev(); } /*定义USBset接口 * 接口,就是规定,里面只能放“抽象方法”和“常量”的一种类似类的结构体; * */ interface USBset{ const USBWidth = 12; const USBHeight = 5; function dataIn();//数据输入 function dataOut();//数据输出 } /*这里MP3Player类必须实现Player,USBset中的所有方法 *php语言中一个类不可以继承多个类,但是一个类可以继承多个接口 * */ class MP3Player implements Player,USBset { function Play(){} function stop(){} function next(){} function prev(){} function dataIn(){} function dataOut(){} }