Menu
Coddy logo textTech

Введение в интерфейсы

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

challenge icon

Задание

Легко

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

Вы организуете свой код в двух файлах:

  • Messageable.php: Define interface с именем Messageable, объявляющий две сигнатуры method: compose($content) для создания сообщения и deliver() для его отправки. Remember, у методов interface нет body — только сигнатура, ending точкой с запятой.
  • main.php: Include файл Messageable. Чтобы проверить, правильно ли определён ваш interface, используйте функцию PHP interface_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: Пройдитесь по методам в цикле и выведите имя каждого метода на отдельной строке

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

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

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

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