Реализация интерфейсов
Определяйте контракты с помощью interface и реализуйте их в нескольких классах
«Реализация интерфейсов» — бесплатный урок PHP Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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 часто встречаются во фреймворках, ORM и служебных уровнях. Понимание этой возможности подготовит Вас к участию в профессиональных проектах на PHP.
Распространённые ошибки
Избегайте этих ошибок при работе с интерфейсами PHP:
- Классы могут реализовывать несколько интерфейсов, но расширять только один класс
- Интерфейсы не могут иметь свойства или тела методов (за исключением реализации по умолчанию в PHP 8)
- Всегда ориентируйтесь на интерфейс (абстрактный тип), а не на реализацию
- Используйте интерфейсы для внедрения зависимостей и создания имитаций в тестах
Быстрая проверка
Сколько интерфейсов класс PHP может реализовывать одновременно?
Итоги: интерфейсы PHP
Итоги:
- Классы могут реализовывать несколько интерфейсов, но расширять только один класс
- Интерфейсы не могут иметь свойства или тела методов (за исключением реализации по умолчанию в PHP 8)
- Всегда ориентируйтесь на интерфейс (абстрактный тип), а не на реализацию
- Используйте интерфейсы для внедрения зависимостей и создания имитаций в тестах
Часто задаваемые вопросы
Урок «Реализация интерфейсов» бесплатный?
Да — полный текст урока «Реализация интерфейсов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Реализация интерфейсов»?
Определяйте контракты с помощью interface и реализуйте их в нескольких классах Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Реализация интерфейсов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Расширение классов с помощью наследования
- Абстрактные классы и методы
- Реализация интерфейсов
- Трейты для повторного использования кода