← Назад к вопросам

Что пишут в интерфейсе?

2.0 Middle🔥 192 комментариев
#ООП

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое интерфейс в ООП и что в него пишут?

Интерфейс (interface) в объектно-ориентированном программировании (ООП) — это специальная языковая конструкция, которая определяет контракт или абстрактный протокол для классов. Он задаёт что класс должен делать, но не определяет как именно он это делает. Это один из ключевых инструментов для реализации полиморфизма и проектирования слабосвязанных, расширяемых архитектур.

Что именно пишут в теле интерфейса?

В интерфейсе объявляются только сигнатуры методов (public-методов) без их реализации, а также константы.

1. Сигнатуры публичных методов (абстрактные методы) Это основа интерфейса. Указывается только имя метода, типы принимаемых аргументов и тип возвращаемого значения.

<?php

interface LoggerInterface
{
    // Объявление метода без тела
    public function log(string $message, string $level): void;

    // Метод с обязательным аргументом
    public function emergency(string $message): void;

    // Метод с опциональным (nullable) аргументом
    public function warning(string $message, ?array $context = null): void;
}

Класс, реализующий (implements) этот интерфейс, обязан предоставить конкретную реализацию для каждого объявленного метода.

2. Константы (только public) Интерфейсы могут содержать константы, которые автоматически являются public, static и final. Они часто используются для определения типов, состояний или кодов ошибок в рамках контракта.

<?php

interface HttpStatusCodes
{
    public const OK = 200;
    public const NOT_FOUND = 404;
    public const SERVER_ERROR = 500;
}

interface UserRoles
{
    public const ROLE_GUEST = 0;
    public const ROLE_USER = 1;
    public const ROLE_ADMIN = 2;
}

Что НЕ пишут в интерфейсе?

  • Тела методов (реализация). Интерфейс — это чистая абстракция.
  • Свойства (поля класса). Нельзя объявлять переменные экземпляра.
  • Приватные или защищённые методы. Все методы в интерфейсе по определению публичные.
  • Конструкторы или деструкторы (хотя в некоторых языках это возможно, в PHP — нет для обычных интерфейсов).
  • Статические методы (до PHP 8.0). Начиная с PHP 8.0, в интерфейсах можно объявлять статические методы, но их реализация по-прежнему должна быть предоставлена в классе.
<?php
// Пример с PHP 8.0+
interface FactoryInterface
{
    // Статический метод в интерфейсе
    public static function createDefault(): self;
}

Зачем используют интерфейсы? Ключевые преимущества

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

    <?php
    function processOrder(LoggerInterface $logger) {
        // Нам неважно, какой именно логгер передан
        $logger->info('Order processing started');
        // ... логика
    }
    
  2. Разделение абстракции и реализации (Dependency Inversion Principle): Классы должны зависеть от абстракций (интерфейсов), а не от конкретных деталей. Это делает систему гибче и пригоднее для тестирования (легко подменить реальную зависимость на mock-объект в юнит-тестах).

  3. Обеспечение совместимости и стандартизации: Интерфейсы в PHP часто используются для создания стандартов внутри фреймворков (например, Psr\Log\LoggerInterface в PSR-3). Это гарантирует, что компоненты от разных разработчиков будут взаимозаменяемы.

  4. Множественное наследование: В отличие от классов, PHP-класс может реализовывать несколько интерфейсов одновременно. Это позволяет классу объявить, что он соответствует нескольким разным контрактам.

    <?php
    class AdvancedLogger implements LoggerInterface, CacheableInterface, EventDispatcherAwareInterface
    {
        // Реализация методов всех трёх интерфейсов
    }
    

Интерфейсы vs. Абстрактные классы

  • Интерфейс — это "может делать" (чистый контракт). Класс реализует интерфейс.
  • Абстрактный класс — это "является" (частичная реализация + контракт). Класс наследуется от абстрактного класса. Абстрактный класс может содержать реализованные методы, свойства, иметь модификаторы доступа.

Итог: В интерфейс пишут сигнатуры публичных методов и публичные константы. Это мощный инструмент проектирования, который заставляет продумывать архитектуру, уменьшает связность кода и делает его более читаемым, тестируемым и готовым к изменениям. Использование интерфейсов — признак зрелого объектно-ориентированного дизайна.

Что пишут в интерфейсе? | PrepBro