Введение в интерфейсы
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 27 из 91.
Интерфейс определяет контракт, которому должны следовать классы. В отличие от абстрактных классов, которые могут содержать как абстрактные, так и конкретные методы, интерфейс только объявляет сигнатуры методов без какой-либо реализации. Думайте об этом как об обещании: любой класс, реализующий интерфейс, гарантирует, что он предоставит эти конкретные методы.
Вы определяете интерфейс, используя ключевое слово interface:
<?php
interface Printable {
public function print();
}
Этот интерфейс объявляет, что любой класс, реализующий Printable, должен иметь метод print(). Интерфейсу не важно, как работает этот метод, важно лишь то, что он существует.
Вот простой пример, показывающий базовую структуру:
<?php
interface Drivable {
public function start();
public function stop();
}
Обратите внимание, что методы интерфейса не имеют тела, только сигнатуру, заканчивающуюся точкой с запятой. Все методы в интерфейсе неявно являются публичными (public), поэтому вы не можете использовать private или protected.
Интерфейсы — это мощный инструмент, поскольку они позволяют несвязанным классам разделять общее поведение. Car и Motorcycle могут не иметь ничего общего с точки зрения наследования, но оба могут реализовывать Drivable, чтобы гарантировать наличие методов start() и stop().
Ключевой момент: Интерфейс определяет, какие методы должен иметь класс, а не то, как они должны работать. Он устанавливает контракт, который должны выполнять реализующие его классы.
Задание
ЛегкоДавайте создадим простую систему обмена сообщениями, которая познакомит вас с интерфейсами. Вы определите интерфейс, устанавливающий контракт на то, как должны обрабатываться сообщения, закладывая основу для реализующих классов, которые вы создадите в следующем уроке.
Вы организуете свой код в двух файлах:
Messageable.php— Определите интерфейс с именемMessageable, который объявляет сигнатуры двух методов:compose($content)для создания сообщения иdeliver()для его отправки. Помните, что методы интерфейса не имеют тела — только сигнатуру, заканчивающуюся точкой с запятой.main.php— Подключите файл Messageable. Чтобы убедиться, что ваш интерфейс определен правильно, используйте функцию PHPinterface_exists(), чтобы проверить, существует лиMessageable. Затем используйтеReflectionClassдля проверки вашего интерфейса и вывода списка его методов. Создайте рефлексию вашего интерфейса, получите его методы с помощьюgetMethods()и выведите имя каждого метода на отдельной строке.
Ваш вывод должен отображать имена двух методов, которые объявляет ваш интерфейс, каждый на отдельной строке, в том порядке, в котором вы их определили.
Эта задача сосредоточена исключительно на определении интерфейса — контракта, который будущие классы должны будут выполнить. Вы устанавливаете, какие методы должны существовать, не беспокоясь о том, как они будут работать. Эта реализация появится в следующем уроке!
Шпаргалка
Интерфейс определяет контракт, которому должны следовать классы. Он только объявляет сигнатуры методов без какой-либо реализации.
Определите интерфейс, используя ключевое слово interface:
<?php
interface Printable {
public function print();
}
Методы интерфейса не имеют тела, только сигнатуру, заканчивающуюся точкой с запятой. Все методы в интерфейсе неявно являются публичными (public).
<?php
interface Drivable {
public function start();
public function stop();
}
Интерфейсы позволяют несвязанным классам разделять общее поведение, гарантируя, что они реализуют определенные методы.
Попробуйте сами
<?php
// Подключите файл интерфейса Messageable
require_once 'Messageable.php';
// TODO: Используйте interface_exists(), чтобы проверить, существует ли интерфейс Messageable
// TODO: Создайте объект ReflectionClass для интерфейса Messageable
// TODO: Получите методы с помощью getMethods()
// TODO: Переберите методы в цикле и выведите имя каждого метода на отдельной строке
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy