接口简介
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 27 课,共 91 课。
接口定义了类必须遵循的契约。与可以同时包含抽象方法和具体方法的抽象类不同,接口只声明方法签名,不提供任何实现。你可以把它看作一种承诺:任何实现接口的类都保证会提供这些特定方法。
你可以使用 interface 关键字定义接口:
<?php
interface Printable {
public function print();
}
这个接口声明,任何实现 Printable 的类都必须有一个 print() 方法。接口不关心这个方法如何工作,只要求它存在。
下面是一个展示基本结构的简单示例:
<?php
interface Drivable {
public function start();
public function stop();
}
请注意,接口方法没有方法体,只有以分号结尾的方法签名。接口中的所有方法都隐式为 public,因此你不能使用 private 或 protected。
接口很强大,因为它们允许彼此无关的类共享相同的行为。Car 和 Motorcycle 在继承关系上可能毫无关联,但它们都可以实现 Drivable,以确保它们具有 start() 和 stop() 方法。
关键点:接口定义了一个类必须具有哪些方法,而不是这些方法应该如何工作。它建立了一份契约,实现该接口的类必须遵守。
挑战
简单让我们构建一个简单的消息系统,认识一下接口。你将定义一个接口,规定消息应如何处理,为你将在下一课中创建的实现类打下基础。
你将把代码分布在两个文件中:
Messageable.php:定义一个名为Messageable的接口,其中声明两个方法签名:compose($content)用于创建消息,deliver()用于发送消息。请记住,接口方法没有方法体,只有以分号结尾的方法签名。main.php:引入 Messageable 文件。要验证接口是否正确定义,请使用 PHP 的interface_exists()函数检查Messageable是否存在。然后使用ReflectionClass检查接口并列出其中的方法。创建接口的反射对象,使用getMethods()获取它的方法(该函数会返回ReflectionMethod对象),并将每个方法的getName()单独打印在一行上。
输出应显示接口声明的两个方法名,每个名称单独占一行,顺序与定义时一致。
这个挑战只关注定义接口,也就是未来的类需要遵守的契约。你要规定必须有哪些方法,而不必考虑它们如何工作。具体实现将在下一课中完成!
亲手试试
<?php
// 引入 Messageable 接口文件
require_once 'Messageable.php';
// TODO: 使用 interface_exists() 检查 Messageable 接口是否存在
// TODO: 为 Messageable 接口创建一个 ReflectionClass 对象
// TODO: 使用 getMethods() 获取方法
// TODO: 遍历这些方法,每行打印一个方法名
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器