Писал ли интерфейсы в 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 для констант.

Ответ 18+ 🔞

Ага, ну вот, значит, постоянно эти интерфейсы в проектах юзаю, чтобы архитектура была гибкая и тестируемая, а не какая-нибудь пиздопроебибна. Интерфейс — это, по сути, контракт, ёпта. Набор методов, которые класс обязан реализовать, а как он это сделает — его личные проблемы, в рот мне чих-пых.

Вот, смотри, элементарный пример:

// Контракт для службы отправки уведомлений
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: С восьмёрки интерфейсы стали поумнее, константы там поддерживают, объявления final для них. В общем, не то что в старые времена, ёперный театр.