Введение в интерфейсы
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 27 из 91.
interface определяет контракт, которому должны следовать классы. В отличие от абстрактных классов, которые могут содержать как абстрактные, так и конкретные methods, interface только объявляет сигнатуры methods без какой-либо реализации. Представь это как обещание: любой класс, реализующий interface, гарантирует, что предоставит именно эти methods.
Вы определяете интерфейс с помощью ключевого слова interface:
<?php
interface Printable {
public function print();
}
Этот interface объявляет, что любой класс, реализующий Printable, must have метод print(). interface не важно, как работает method, важно лишь, что он exists.
Вот простой пример, демонстрирующий базовую структуру:
<?php
interface Drivable {
public function start();
public function stop();
}
Обратите внимание, что методы interface не имеют body, just сигнатуру, ending с semicolon. Все methods в interface неявно являются public, поэтому нельзя использовать private или protected.
Интерфейсы powerful, потому что они позволяют несвязанным классам иметь общее поведение. У Car и Motorcycle может не быть ничего общего с точки зрения наследования, но оба могут реализовать Drivable, чтобы гарантировать наличие методов start() и stop().
Ключевой момент: interface определяет, какие methods должен иметь класс, а не то, как они должны работать. Он устанавливает контракт, который реализующие его классы должны выполнять.
Задание
ЛегкоДавайте создадим простую систему обмена сообщениями, которая познакомит вас с interface. Вы определите interface, устанавливающий контракт того, как должны обрабатываться сообщения, и заложите основу для реализующих классов, которые создадите на следующем уроке.
Вы организуете свой код в двух файлах:
Messageable.php: Define interface с именемMessageable, объявляющий две сигнатуры method:compose($content)для создания сообщения иdeliver()для его отправки. Remember, у методов interface нет body — только сигнатура, ending точкой с запятой.main.php: Include файл Messageable. Чтобы проверить, правильно ли определён ваш interface, используйте функцию PHPinterface_exists(), чтобы проверить, существует лиMessageable. Затем используйтеReflectionClass, чтобы исследовать ваш interface и перечислить его methods. Создайте reflection вашего interface, получите его methods с помощьюgetMethods()(который возвращает объектыReflectionMethod) и выведитеgetName()каждого method в отдельной строке.
В результате должны отображаться два имени method, объявленные вашим interface, каждое в отдельной строке, в том порядке, в котором вы их определили.
Это задание посвящено исключительно определению interface: контракту, которому в будущем должны будут соответствовать классы. Вы устанавливаете, какие methods должны существовать, не беспокоясь о том, как они будут работать. Эта реализация появится на следующем уроке!
Попробуйте сами
<?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Модификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (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