Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

  • Playable.php: Define interface Playable с единственной сигнатурой method: play(). Этот контракт гарантирует, что любое воспроизводимое медиа может быть запущено.
  • Shareable.php: Define interface Shareable с единственной сигнатурой method: share($platform). Этот контракт гарантирует, что любым доступным для sharing содержимым можно делиться на разных platform.
  • Video.php: Create класс Video, который implements both Playable и Shareable. Include оба файла interface в верхней части. У класса должны быть private $title property и private $duration property (в minutes). constructor accepts title и duration. Implement play(), чтобы он возвращал "Playing video: [title] ([duration] min)". Implement share($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 на второй строке

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор PHP