开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第二阶段:接口成员】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/712/detail/12708
接口成员
目录
一、概念
二、示例
三、小结
一、概念
接口成员:在接口内部定义的成员。
1、接口成员只能有两类:
(1)接口常量:const;
(2)公有的接口方法,普通方法和静态方法都可以,不能有属性。
2、接口方法有特点,全部都是抽象方法
没有具体的实现,没有方法体(它不需要用 abstract 关键字,因为它不是类,它里面规定方法都是没有方法体的,所以不需要 abstract 关键字,但是都是抽象方法)。
3、实现接口的类:
(1)可以访问接口里面的常量,接口定义的常量可以直接用,而且接口常量是不能被重写的,类里面不能定义同名的接口常量;
(2)需要实现所有的接口方法(除非类本身是抽象类,抽象类去实现接口,不需要去实现里面的方法);
二、接口方法实现不允许增加控制权限,所以接口里面定义的方法都是公有的方法(必须是 public,其他方法接口不予定义)。
二、示例
1、接口成员:接口中只能定义公有抽象方法和接口常量。
interface Human{
# 接口常量
const NAME = '人';
# 接口抽象方法
public function eat();
public static function show();
# 错误示例
public function go(){}
# 错误:有方法体不是抽象的,接口中的方法必须为抽象
public $age;
# 错误:接口中不能有属性
public static $count = 0;
# 错误:接口中不能有静态属性(成员属性)
protected function walk();
# 错误:这是受保护的抽象方法,接口方法必须为公有抽象方法
}
代码运行:
2、接口成员方法必须被实现的子类实现或者类为抽象类,接口常量可以直接在实现类中使用。
interface Human{
# 接口常量
const NAME = '人';
# 接口抽象方法
public function eat();
}
# 实现接口
class Man implements Human{
# 必须实现接口所有抽象方法
public function eat(){
echo self::NAME;
# 可以访问接口常量
}
}
# 抽象类实现接口
abstract class Ladyboy implements Human{}
# 正常实现
代码运行:
系统告诉我们,这个类包含了两个抽象方法,这两个方法是从接口里面来的,所以要么这个类为抽象类,要么实现这个里面所有的接口方法。
(1)必须实现接口中所有的抽象方法:
public function eat(){}
public static function show(){}
这样就可以了。
(2)使用抽象类来实现:
abstract class woman implements Human{}
这样也没有问题。因为抽象类不能被实例化,所以它不实现也可以。凡是能够实例化的,就意味着这里面的方法都应该是可以调用的,就必须要有方法体。
3、类实现接口的成员,不允许重写接口中的常量不允许增加接口方法的控制权限。
class woman implements Human{
# 重写接口常量
const NAME ='女人';
# 错误:不允许重写接口常量
# 强化接口方法控制
private function eat(){}
# 错误:接口方法不允许使用其他访问修饰限定符,必须使用 public
}
代码运行:
想重写接口常量,自己定一个,但是与接口里面重名。
#实现接口:实体类
class Man implements Human{
#不允许重写接口常量
#const NAME =’Man’;
结果显示不能够继承前面被继承或者重写常量,就是从接口得来的常量不能够重写。虽然系统如果通过这种翻译,好像也是继承的关系,因为本质其实差不多,结构类似,但是具体它就不叫继承,就叫实现。
把 public 换成 protected,不想对外访问。
protected static function show(){}
由图所示是不可以的,必须为 pubic。as in class,它并没有说 as in interface,说明从系统内部。因为底层结构是一样的,接口、抽象类、类底层结构都是一样的,从这个技术层面来讲,它就是接口。接口方法实现时必须为 public,没得选择。
public static function show(){}
这样才没问题。
三、小结
1、接口成员只有两种:接口常量和公有抽象方法(没有方法体,不需要 abstract 关键字);
2、类实现接口的时候,必须实现接口中所有的抽象方法(或者抽象类实现);
3、接口中的成员不能被实现接口的类进行重写(接口常量)和权限更小(受保护或者私有化接口方法),因为权限变小之后就违背了接口设定的原则,所以只能变成public;
4、接口成员(方法)规定了实现接口的类必须实现所有方法(本质上是从上往下规范类必须要怎么做,完成了这些事情,后面整个团队用起来的时候就可以以接口为标准来使用其它的类),从而从最上层规范整体架构。
(1)大型开发团队中,必要保证类的实现可以让其他类使用成员可知(命名规范),从结构的角度来说,是规定我们应该怎么去写,别人怎么去用,所以它是一种命名的规范;
(2)核心结构类必须实现接口,并实现接口中规范的方法(结构规范)。这是从结构的层面规范我们的类该怎么去写。
从命名规范和结构规范一起来保证整个的架构从上往下是统一的,这样我们的项目使用和维护都会比较轻松,但是开发的难度显然要大一些。