Ответ
Интерфейс в ООП — это контракт, который определяет что должен делать класс (список публичных методов), но не как он это делает. Класс, реализующий интерфейс, обязан предоставить конкретную реализацию всех его методов.
Ключевые цели использования интерфейсов:
- Полиморфизм и абстракция: Код может работать с объектами через интерфейс, не зная их конкретного типа. Это позволяет легко подменять реализации.
- Снижение связанности (Loose Coupling): Классы зависят от абстракций (интерфейсов), а не от конкретных деталей реализации других классов.
- Определение ролей: Интерфейс часто описывает определенную роль в системе (например,
Logger,CacheDriver,PaymentGateway). - Обеспечение контракта для сторонних разработок, например, при создании плагинов.
Практический пример с Dependency Injection в PHP:
// Контракт для службы отправки уведомлений
interface NotificationSender {
public function send(string $to, string $message): bool;
}
// Конкретные реализации
class EmailSender implements NotificationSender {
public function send(string $to, string $message): bool {
// Логика отправки email
echo "Sending email to $to: $messagen";
return true;
}
}
class SmsSender implements NotificationSender {
public function send(string $to, string $message): bool {
// Логика отправки SMS
echo "Sending SMS to $to: $messagen";
return true;
}
}
// Сервис, который зависит от абстракции (интерфейса)
class OrderService {
private NotificationSender $sender;
// Внедрение зависимости через интерфейс
public function __construct(NotificationSender $sender) {
$this->sender = $sender;
}
public function confirmOrder(string $userEmail): void {
// ... логика подтверждения заказа ...
$this->sender->send($userEmail, "Your order is confirmed!");
}
}
// Использование. Реализацию можно легко менять.
$emailService = new OrderService(new EmailSender());
$smsService = new OrderService(new SmsSender());
$emailService->confirmOrder('client@example.com');
Таким образом, интерфейсы — мощный инструмент для создания гибкой, тестируемой и поддерживаемой архитектуры.