Реализация нескольких интерфейсов
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 29 из 91.
В отличие от наследования, где класс может расширять только одного родителя, PHP позволяет классу реализовывать несколько интерфейсов. Это дает вам гибкость в объединении различных контрактов, делая ваши классы более универсальными.
Для реализации нескольких интерфейсов перечислите их через запятую после ключевого слова implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
private $title;
public function __construct($title) {
$this->title = $title;
}
public function print() {
return "Printing: " . $this->title;
}
public function save() {
return "Saving: " . $this->title;
}
}
$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();
Вывод:
Printing: Sales Report
Saving: Sales ReportКласс Report выполняет оба контракта, реализуя все методы из Printable и Savable. Вы должны предоставить реализации для каждого метода, объявленного в каждом интерфейсе.
Этот подход эффективен, так как он позволяет создавать классы, удовлетворяющие нескольким требованиям без ограничений одиночного наследования. Класс может быть печатаемым, сохраняемым, экспортируемым и не только — и всё это одновременно.
Ключевой момент: Используйте запятые для реализации нескольких интерфейсов. Ваш класс должен предоставить конкретные реализации для всех методов каждого интерфейса, который он реализует.
Задание
ЛегкоДавайте создадим систему медиафайлов, которая демонстрирует, как один класс может реализовывать несколько интерфейсов для получения различных возможностей.
Вы создадите четыре файла, которые работают вместе для обработки медиафайлов, которые можно как воспроизводить, так и делиться ими:
Playable.php— Определите интерфейсPlayableс одной сигнатурой метода:play(). Этот контракт гарантирует, что любой воспроизводимый медиафайл может быть запущен.Shareable.php— Определите интерфейсShareableс одной сигнатурой метода:share($platform). Этот контракт гарантирует, что любой контент, которым можно поделиться, может быть распространен на различные платформы.Video.php— Создайте классVideo, который реализует оба интерфейсаPlayableиShareable. Подключите оба файла интерфейсов в начале. Класс должен иметь приватное свойство$titleи приватное свойство$duration(в минутах). Конструктор принимает название и длительность. Реализуйтеplay(), чтобы он возвращал"Playing video: [title] ([duration] min)". Реализуйтеshare($platform), чтобы он возвращал"Sharing [title] on [platform]".main.php— Подключите файл Video. Вы получите три входных значения: название видео, длительность (в виде строки для преобразования в целое число) и название платформы. Создайте объектVideoс названием и длительностью. Выведите результат вызоваplay()на первой строке, затем выведите результат вызоваshare()с указанием платформы на второй строке.
Ваш класс Video выполняет два отдельных контракта одновременно — его можно воспроизводить как любой медиафайл, и им можно делиться в социальных платформах. В этом заключается сила реализации нескольких интерфейсов: один класс получает возможности из разных источников, не ограничиваясь одной цепочкой наследования.
Шпаргалка
Класс может реализовывать несколько интерфейсов, перечисляя их через запятую после ключевого слова implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
public function print() {
return "Printing report";
}
public function save() {
return "Saving report";
}
}Класс должен предоставить конкретные реализации для всех методов каждого интерфейса, который он реализует. Это позволяет классу выполнять несколько контрактов одновременно без ограничений одиночного наследования.
Попробуйте сами
<?php
// Подключите файл Video
require_once 'Video.php';
// Чтение входных данных
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: Создайте объект Video с названием и длительностью
// TODO: Выведите результат вызова play() на первой строке
// TODO: Выведите результат вызова share() с платформой на второй строке
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy