Отличия абстрактного класса от интерфейса в PHP

В этой статье рассмотрен ответ на один из самых задаваемых вопросов на собеседованиях на должность PHP-программиста.

Данный материал поможет вам лучше понять в чем же их отличия.

Абстрактный класс

Надеюсь, что вы хорошо разбираетесь в том, что из себя представляет класс в PHP. В качестве наглядного примера можно привести аналогию с чертежом. Так вот, если класс — это чертеж, то абстрактный класс можно считать наброском.

Особенности абстрактного класса:

  • может содержать абстрактные методы (без реализации)
  • может содержать свойства и неабстрактные методы (с реализацией)
  • абстрактные методы обязательно должны быть перегружены (реализованы) в классе-потомке
  • нельзя создать экземпляр абстрактного класса

Это удобно для контроля. Руководитель проекта раздал абстрактный класс команде и может быть уверен что все абстрактные методы будут реализованы, иначе — "fatal error".

Пример абстрактного класса:

Интерфейс

Если абстрактный класс — это набросок чертежа, то интерфейс можно представить как грубый набросок. На самом деле интерфейс является все тем же абстрактным классом, но с небольшими особенностями.

Особенности интерфейса:

  • интерфейс не может содержать методы с реализацией и свойства
  • интерфейс реализуется (implements), а абстрактный класс наследуется (extends)
  • наследовать мы можем только 1 класс, а реализовать сколько угодно интерфейсов

Пример интерфейсов с множественным наследованием:

Скорее всего у вас возник вопрос:

Зачем нам нужен интерфейс, если можно использовать абстрактный класс?

Все дело в том, что можно унаследоваться только от одного абстрактного класса, но возможно реализовать несколько интерфейсов.

Плюс ко всему, в качестве приятного дополнения, ВСЕ методы, описанные в интерфейсе, обязательно ДОЛЖНЫ быть реализованы в классе, а в абстрактном классе их нужно для этой цели специально отмечать ключевым словом abstract.