Menu
Coddy logo textTech

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

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

Ключевой момент: Интерфейс определяет, какие методы должен иметь класс, а не то, как они должны работать. Он устанавливает контракт, который должны выполнять реализующие его классы.

challenge icon

Задание

Легко

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

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

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

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

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

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