0Pricing
PHP Academy · 课时

实现接口

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用继承扩展类
  2. 抽象类与抽象方法
  3. 实现接口
  4. 使用 Trait 复用代码
← 返回 PHP Academy