Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 28 из 91.

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

<?php
interface Printable {
    public function print();
}

class Document implements Printable {
    private $content;
    
    public function __construct($content) {
        $this->content = $content;
    }
    
    public function print() {
        return "Printing: " . $this->content;
    }
}

$doc = new Document("Hello World");
echo $doc->print();

Вывод:

Printing: Hello World

Класс Document реализует Printable, предоставляя собственную версию метода print(). Если вы забудете реализовать обязательный метод, PHP выдаст фатальную ошибку.

Разные классы могут реализовать один и тот же interface по-своему:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

$invoice = new Invoice(150);
echo $invoice->print();

Вывод:

Invoice Total: $150

И Document, и Invoice выполняют контракт Printable, но каждый обрабатывает печать по-разному в зависимости от своего назначения.

Ключевой момент: Используйте implements, чтобы связать class с interface, а затем определите все необходимые method. Каждый реализующий class предоставляет собственную логику, гарантируя при этом наличие одинаковых сигнатур method.

challenge icon

Задание

Легко

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

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

  • Messageable.php: Define interface Messageable с двумя сигнатурами method: compose($content) и deliver(). Этот interface устанавливает контракт, которому должны следовать все типы сообщений.
  • Email.php: Create class Email, который implements Messageable. Подключите файл interface в начале. У класса должны быть private property $recipient и private property $body. constructor accepts address получателя. Реализуйте compose($content), чтобы сохранить content в $body и вернуть "Email composed". Реализуйте deliver(), чтобы вернуть "Email to [recipient]: [body]".
  • SMS.php: Create class SMS, который также implements Messageable. Подключите файл interface в начале. У класса должны быть private property $phoneNumber и private property $text. constructor accepts phone number. Реализуйте compose($content), чтобы сохранить content в $text и вернуть "SMS composed". Реализуйте deliver(), чтобы вернуть "SMS to [phoneNumber]: [text]".

В main.php подключите оба файла — Email и SMS. Вы получите три inputs: email address, phone number и message content. Создайте object Email с email address и object SMS с phone number. Вызовите compose() с message content для обоих objects, выводя каждый результат на отдельной строке. Затем вызовите deliver() для обоих objects, выводя каждый результат на отдельной строке. Порядок должен быть таким: compose для email, compose для SMS, deliver для email, deliver для SMS.

Оба класса fulfill один и тот же контракт Messageable, но каждый обрабатывает composing и delivering сообщений в соответствии со своим назначением: email показывают address получателя, а SMS показывают phone number.

Попробуйте сами

<?php
require_once 'Email.php';
require_once 'SMS.php';

// Читать входные данные
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));

// TODO: Создать объект Email с адресом электронной почты

// TODO: Создать объект SMS с номером телефона

// TODO: Вызвать compose() на обоих объектах и вывести результаты
// Order: email compose, then SMS compose

// TODO: Вызвать deliver() на обоих объектах и вывести результаты
// Порядок: email deliver, затем SMS deliver
?>
quiz iconПроверьте себя

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

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

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