Menu
Coddy logo textTech

Реализация нескольких интерфейсов

Часть раздела Объектно-ориентированное программирование путешествия по 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. Вы должны предоставить реализации для каждого метода, объявленного в каждом интерфейсе.

Этот подход эффективен, так как он позволяет создавать классы, удовлетворяющие нескольким требованиям без ограничений одиночного наследования. Класс может быть печатаемым, сохраняемым, экспортируемым и не только — и всё это одновременно.

Ключевой момент: Используйте запятые для реализации нескольких интерфейсов. Ваш класс должен предоставить конкретные реализации для всех методов каждого интерфейса, который он реализует.

challenge icon

Задание

Легко

Давайте создадим систему медиафайлов, которая демонстрирует, как один класс может реализовывать несколько интерфейсов для получения различных возможностей.

Вы создадите четыре файла, которые работают вместе для обработки медиафайлов, которые можно как воспроизводить, так и делиться ими:

  • 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() с платформой на второй строке

?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование