Реализация нескольких интерфейсов
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 29 из 91.
В отличие от наследования, при котором class может расширять только один родительский класс, PHP позволяет class реализовывать несколько interfaces. Это даёт тебе гибкость комбинировать разные контракты, делая твои классы более универсальными.
Чтобы Implement несколько интерфейсов, раздели их запятыми после ключевого слова 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. Ты должен предоставить реализации для каждого метода, объявленного в каждом интерфейсе.
Этот подход эффективен, потому что позволяет создавать классы, которые удовлетворяют нескольким требованиям, без ограничений одиночного наследования. class может быть печатаемым, сохраняемым, экспортируемым и многим другим одновременно.
Ключевой момент: Используйте запятые, чтобы реализовать несколько interface. Ваш class должен предоставлять конкретные реализации для всех methods из каждого interface, который он implements.
Задание
ЛегкоДавайте создадим файловую систему для медиафайлов, демонстрирующую, как один класс может реализовать несколько interface и получить различные возможности.
Вы создадите четыре файла, которые будут работать вместе для обработки медиафайлов, которые можно both воспроизводить и делиться ими:
Playable.php: Define interfacePlayableс единственной сигнатурой method:play(). Этот контракт гарантирует, что любое воспроизводимое медиа может быть запущено.Shareable.php: Define interfaceShareableс единственной сигнатурой method:share($platform). Этот контракт гарантирует, что любым доступным для sharing содержимым можно делиться на разных platform.Video.php: Create классVideo, который implements bothPlayableиShareable. Include оба файла interface в верхней части. У класса должны быть private$titleproperty и private$durationproperty (в minutes). constructor accepts title и duration. Implementplay(), чтобы он возвращал"Playing video: [title] ([duration] min)". Implementshare($platform), чтобы он возвращал"Sharing [title] on [platform]".main.php: Include файл Video. Вы получите три входных значения: название видео, duration (в виде строки, которую нужно преобразовать в целое число) и имя platform. Create объектVideoс названием и duration. Print result вызоваplay()в первой строке, затем Print result вызоваshare()с platform во второй строке.
Ваш класс Video одновременно fulfills два отдельных контракта. Его можно воспроизводить как любое медиа, а также делиться им в социальных platform. В этом заключается сила реализации нескольких interface: один класс получает возможности из разных источников, не будучи ограниченным одной цепочкой наследования.
Попробуйте сами
<?php
// Подключить файл Video
require_once 'Video.php';
// Считать входные данные
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: Создать объект Video с title и duration
// TODO: Вывести результат вызова play() на первой строке
// TODO: Вывести результат вызова share() с platform на второй строке
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP