Реализация интерфейсов
Часть раздела Объектно-ориентированное программирование путешествия по 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.
Задание
ЛегкоДавайте создадим систему обмена сообщениями, демонстрирующую, как разные классы могут по-своему реализовывать один и тот же interface.
Вы создадите три файла, которые будут работать вместе для обработки разных типов сообщений:
Messageable.php: Define interfaceMessageableс двумя сигнатурами method:compose($content)иdeliver(). Этот interface устанавливает контракт, которому должны следовать все типы сообщений.Email.php: Create classEmail, который implementsMessageable. Подключите файл interface в начале. У класса должны быть private property$recipientи private property$body. constructor accepts address получателя. Реализуйтеcompose($content), чтобы сохранить content в$bodyи вернуть"Email composed". Реализуйтеdeliver(), чтобы вернуть"Email to [recipient]: [body]".SMS.php: Create classSMS, который также implementsMessageable. Подключите файл 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
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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