Писал ли интерфейсы в PHP?

«Писал ли интерфейсы в PHP?» — вопрос из категории ООП, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Базовый пример:

// Контракт для службы отправки уведомлений
interface NotificationSenderInterface
{
    public function send(string $recipient, string $message): bool;
}

// Конкретная реализация для Email
class EmailNotificationSender implements NotificationSenderInterface
{
    public function send(string $recipient, string $message): bool
    {
        // Логика отправки email
        return mail($recipient, 'Notification', $message);
    }
}

// Конкретная реализация для SMS (используем сторонний сервис)
class SmsNotificationSender implements NotificationSenderInterface
{
    public function send(string $recipient, string $message): bool
    {
        // Логика отправки SMS через API
        // ...
        return true;
    }
}

// Класс, который зависит от абстракции (интерфейса), а не от конкретной реализации
class NotificationService
{
    private NotificationSenderInterface $sender;

    public function __construct(NotificationSenderInterface $sender)
    {
        $this->sender = $sender;
    }

    public function notifyUser(User $user, string $message): void
    {
        $this->sender->send($user->getEmail(), $message);
    }
}

Зачем это нужно:

  1. Соблюдение DIP (Принцип инверсии зависимостей): Классы зависят от абстракций, что позволяет легко подменять реализации (например, заменить реальную отправку SMS на мок в тестах).
  2. Полиморфизм: Можно передавать любой объект, реализующий интерфейс, в метод, который ожидает этот интерфейс.
  3. Четкое проектирование: Интерфейс явно описывает, что должен уметь делать класс, что улучшает читаемость и понимание кода.
  4. Поддержка современных возможностей PHP: Начиная с PHP 8.0, интерфейсы могут содержать константы, а с PHP 8.1 — объявления final для констант.