Интерфейс — основа полиморфизма.
Есть один интерфейс, с ним умеет работать некий код. Вуаля, любая реализация этого интерфейса подходит для этого самого кода.
Пример: есть некий класс заказа
Order, он работает с неким отправителем
Sender, мы можем жестко "научить" его работать с ним в коде этого
Order, а можем просто передавать ему отправителя через конструктор (привет DI), но передавать не сам класс/реализацию, а лишь его абстракцию — интерфейс, то, что будет отправлять, но как — не важно, это будет
SenderInterface.
Теперь мы в Order можем юзать полиморфизм: использовать любой
Sender, который реализует этот самый
SenderInterface
Код:
interface SenderInterface
{
public function send(): void {};
}
class Order
{
// тут будет любой, но обязан реализовать SenderInterface
private $sender;
public function __constuctor(SenderInterface $sender) {
$this->sender = $sender;
}
public function save(): void
{
// какой в приватном поле сидит, тот и отправит,
// а кто -- текущему объекту все равно, это есть инверсия зависимости
// и принцип единственной ответственности, данный класс не отправляет, а поручает
$this->sender->send();
}
}
class MailSender implement SenderInterface
{
public function send(): void
{
// тут отправка почтой
}
}
class TelegramSender implement SenderInterface
{
public function send(): void
{
// тут отправка телегой
}
}
// Пример полиморфной работы Order
$order = new Order(new TelegramSender());
$order->save(); // тут отправка телеграмом
$order = new Order(new MailSender());
$order->save(); // тут отправка mail
Как видите, мы можем добавлять новые сендеры, в них что-то делать, а с ордером будем работать как прежде
$order->save()
, и вообще его код не трогать
Дополнение
Интерфейс есть у любого класса (публичны/приватный), интерфейс наследуется у абстрактного/обычного класса ребенком (кроме того, что наследует поведение), почему полиморфизм иногда (на самом деле ооочень часто) объясняют именно на наследовании одного класса и множественной реализации в виде детей. На самом деле все дело в этом самом интерфейсе.