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

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

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

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

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

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

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

Добавить комментарий