Интерфейсы

ООП PHP

Под «интерфейсом» в языках программирования обычно понимают обязательство класса по реализации функционала (набора методов), который описан в интерфейсе.

Интерфейсы похожи на классы, но у них есть отличительные особенности:

  • интерфейс определяется с помощью ключевого слова «interface»;
  • интерфейс не содержит реализации методов, а только их определения;
  • все методы интерфейса должны быть публичными.

Подробнее об особенностях реализации интерфейсов в PHP можно узнать из официальной документации.

firstMethod();
$object->secondMethodWithParams(1, 'two');
$object->thirdMethod();

echo $object::CONST_NAME;

В реализации механизма интерфейсов на PHP есть свои особенности, например: так как в PHP отсутствует перегрузка методов, то нельзя наследовать интерфейсы с одинаковыми наименованиями методов и разными параметрами. Приведу пример с ошибкой наследования интерфейсов из-за несовпадения сигнатур (определений) методов:



С созданием интерфейсов определились, теперь осталось разобраться как их использовать в реальных проектах. Для примера, рассмотрим следующую ситуацию: у нас есть класс «UserManager», который занимается управлением пользователями и который использует класс «SimpleNotifier» для оповещения пользователей по E-mail. Вот так выглядит его работа:

notifier= $notifier;
    }
 
    public function do()
    {
        // другие действия.
        $this->notifier->send();
        // другие действия.
    }
}
 
$manager = new UserManager(new SimpleNotifier());
$manager->do();

Чтобы «научить» класс «UserManager» отправлять сообщения не только на E-mail, но и на другие устройства, нам необходимо абстрагироваться от класса «SimpleNotifier» с помощью интерфейса. Через интерфейс можно будет передавать любой объект, который реализует функционал объявленный в этом интерфейсе. Вот как будет это выглядеть на нашем примере:

notifier = $notifier;
    }
 
    public function do()
    {
        // другие действия.
        $this->notifier->send();
        // другие действия.
    }
}
 
$manager1 = new UserManager(new SmsNotifier());
$manager1->do();
 
$manager2 = new UserManager(new EmailNotifier());
$manager2->do();

Пример, конечно, крайне упрощен, но смысл должен быть понятен. Через использование интерфейсов вместо классов можно получить свободу от конкретных реализаций, что упростит наращивание и модификацию функционала.

При использовании интерфейсов, как и ООП в общем, нужно знать меру, не создавайте интерфейсы на пустом месте, их использование должно быть оправдано. Как понять, оправдано ли использование интерфейса в выбранном месте или нет? Вопрос сложный, и ответы на него приходят с опытом. Для начала, перед введением интерфейса, стоит задавать себе такой вопрос — «Планируется ли значительно наращивать функционал?».


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

Войдите, чтобы оставить комментарий.