实现接口
使用 interface 定义契约,并在多个类中实现这些契约。
实现接口 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
简介:PHP 接口
接口定义了一份契约:实现它的类必须提供一组方法签名。与抽象类不同,一个类可以实现多个接口。
核心概念
核心概念:
- 使用
interface Name {}声明 - 方法没有方法体,仅包含签名
- 使用
implements InterfaceName实现 - 一个类可以实现多个接口
定义接口
示例:
<?php
interface Serializable {
public function serialize(): string;
public function unserialize(string $data): void;
}
interface Loggable {
public function toLog(): string;
}
// Implementing both interfaces:
class Event implements Serializable, Loggable {
public function __construct(private string $type, private string $data) {}
public function serialize(): string { return json_encode(['type'=>$this->type,'data'=>$this->data]); }
public function unserialize(string $d): void { $a = json_decode($d,true); $this->type=$a['type']; $this->data=$a['data']; }
public function toLog(): string { return "[{$this->type}] {$this->data}"; }
}将接口作为类型
继续:
<?php
interface Cache {
public function get(string $key): mixed;
public function set(string $key, mixed $val, int $ttl = 0): void;
public function delete(string $key): void;
}
// Function accepts any Cache implementation:
function loadUser(int $id, Cache $cache): array {
$key = "user:$id";
$user = $cache->get($key);
if (!$user) {
$user = fetchFromDb($id);
$cache->set($key, $user, 3600);
}
return $user;
}接口常量
深入理解:
<?php
interface HttpMethods {
const GET = 'GET';
const POST = 'POST';
const PUT = 'PUT';
const DELETE = 'DELETE';
}
class Router implements HttpMethods {
public function addRoute(string $method, string $path, callable $handler): void {
// ...
}
}
$router = new Router();
$router->addRoute(HttpMethods::GET, '/users', fn() => []);接口继承接口
实际应用:
<?php
interface Readable {
public function read(): string;
}
interface Writable {
public function write(string $data): void;
}
// Interface can extend multiple interfaces:
interface ReadWrite extends Readable, Writable {
public function seek(int $position): void;
}
class FileStream implements ReadWrite {
public function read(): string { return ''; }
public function write(string $d): void { }
public function seek(int $p): void { }
}使用接口进行依赖注入
高级内容:
<?php
interface MailerInterface {
public function send(string $to, string $subject, string $body): bool;
}
class SmtpMailer implements MailerInterface {
public function send(string $to, string $subject, string $body): bool {
// real SMTP send
return true;
}
}
class UserService {
public function __construct(private MailerInterface $mailer) {}
public function register(string $email): void {
// save user...
$this->mailer->send($email, 'Welcome!', 'Thanks for joining.');
}
}模式
常见的 PHP 接口模式用于简洁地解决反复出现的设计问题。请始终一致地应用这些模式,以编写易读且易维护的代码。
适用时机
了解何时应用 PHP 接口,与了解如何应用同样重要。过度使用会导致复杂性,不充分使用则会导致重复。
实际应用示例
在实际应用中,PHP 接口经常出现在框架、对象关系映射器和服务层中。理解接口有助于您参与专业的 PHP 项目。
常见问题
请避免在使用 PHP 接口时犯以下错误:
- 类可以实现多个接口,但只能扩展一个类
- 接口不能包含属性或方法体(PHP 8 中的默认实现除外)
- 始终面向接口(抽象类型)编程,而不是面向实现编程
- 使用接口支持依赖注入和测试中的模拟
快速检查
一个 PHP 类可以同时实现多少个接口?
回顾:PHP 接口
总结:
- 类可以实现多个接口,但只能扩展一个类
- 接口不能包含属性或方法体(PHP 8 中的默认实现除外)
- 始终面向接口(抽象类型)编程,而不是面向实现编程
- 使用接口支持依赖注入和测试中的模拟
常见问题解答
「实现接口」课时是免费的吗?
是的 — 「实现接口」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「实现接口」这节课中我会学到什么?
使用 interface 定义契约,并在多个类中实现这些契约。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「实现接口」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。