接口成员|学习笔记

简介: 快速学习接口成员,了解接口内部的成员规范,掌握接口的应用。

开发者学堂课程【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(){}      # 错误:有方法体不是抽象的,接口中的方法必须为抽象

图片1.png

public $age;              # 错误:接口中不能有属性

图片2.png

public static $count = 0;    # 错误:接口中不能有静态属性(成员属性)

图片3.png

protected function walk(); # 错误:这是受保护的抽象方法,接口方法必须为公有抽象方法

}

图片4.png

代码运行:

图片5.png

2、接口成员方法必须被实现的子类实现或者类为抽象类,接口常量可以直接在实现类中使用。

interface Human{

# 接口常量

const NAME = '人';

# 接口抽象方法

public function eat();

}

# 实现接口

class Man implements Human{

# 必须实现接口所有抽象方法

public function eat(){

echo self::NAME;          

# 可以访问接口常量

}

}

# 抽象类实现接口

abstract class Ladyboy implements Human{}   # 正常实现

代码运行:

图片6.png

系统告诉我们,这个类包含了两个抽象方法,这两个方法是从接口里面来的,所以要么这个类为抽象类,要么实现这个里面所有的接口方法。

(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’;

 图片7.png

结果显示不能够继承前面被继承或者重写常量,就是从接口得来常量不能够重写。虽然系统如果通过这种翻译,好像也是继承的关系,因为本质其实差不多,结构类似,但是具体它就不叫继承,就叫实现

把 public 换成 protected,不想对外访问。

protected static function show(){}

图片8.png

由图所示是不可以的,必须为 pubicas in class,它并没有说 as in interface,说明从系统内部因为底层结构是一样的,接口抽象类类底层结构都是一样的,从这个技术层面来讲,它就是接口。接口方法实现时必须为 public没得选择

图片9.png

public static function show(){}

这样才没问题。


三、小结

1、接口成员只有两种:接口常量和公有抽象方法(没有方法体不需要 abstract 关键字)

2、类实现接口的时候,必须实现接口中所有的抽象方法(或者抽象类实现)

3、接口中的成员不能被实现接口的类进行重写(接口常量)和权限更(受保护或者私有化接口方法)因为权限变小之后就违背了接口设定的原则,所以只能变成public;

4、接口成员(方法)规定了实现接口的类必须实现所有方法本质上是从上往下规范类必须要怎么做,完成了这些事情,后面整个团队用起来的时候就可以以接口为标准来使用其它的类),从而从最上层规范整体架构。

1)大型开发团队中,必要保证类的实现可以让其他类使用成员可知(命名规范)从结构的角度来说,是规定我们应该怎么去写别人怎么去用,所以它是一种命名的规范

2)核心结构类必须实现接口,并实现接口中规范的方法(结构规范)这是从结构的层面规范我们的类该怎么去写。

从命名规范和结构规范一起来保证整个的架构从上往下是统一的这样我们的项目使用和维护都会比较轻松,但是开发的难度显然要大一些。

相关文章
|
5月前
|
Java C++ Python
私有成员、公共成员、保护成员如何定义
私有成员、公共成员、保护成员如何定义
50 0
|
6月前
|
设计模式 安全 C++
C++ 特殊成员
C++ 特殊成员
54 0
类的内部成员之五:内部类
类的内部成员之五:内部类
39 1
类和对象-封装-成员属性私有化
类和对象-封装-成员属性私有化
52 0
18-类和对象-封装-成员属性私有化
18-类和对象-封装-成员属性私有化
|
NoSQL MongoDB 数据库
成员是否存在查询|学习笔记
快速学习成员是否存在查询
|
数据安全/隐私保护 C++
C++类中数据成员要私有
C++类中数据成员要私有
284 0
|
Java 开发者
反射调用成员|学习笔记
快速学习 反射调用成员
反射调用成员|学习笔记