Отличия абстрактного класса от интерфейса в PHP
В этой статье рассмотрен ответ на один из самых задаваемых вопросов на собеседованиях на должность PHP-программиста. Данный материал поможет вам лучше понять в чем же их отличия.
Абстрактный класс
Надеюсь, что вы хорошо разбираетесь в том, что из себя представляет класс в PHP. В качестве наглядного примера можно привести аналогию с чертежом. Так вот, если класс — это чертеж, то абстрактный класс можно считать наброском.
Особенности абстрактного класса:
- может содержать абстрактные методы (без реализации)
- может содержать свойства и неабстрактные методы (с реализацией)
- абстрактные методы обязательно должны быть перегружены (реализованы) в классе-потомке
- нельзя создать экземпляр абстрактного класса
Это удобно для контроля. Руководитель проекта раздал абстрактный класс команде и может быть уверен что все абстрактные методы будут реализованы, иначе — "fatal error".
Пример абстрактного класса:
Интерфейс
Если абстрактный класс — это набросок чертежа, то интерфейс можно представить как грубый набросок. На самом деле интерфейс является все тем же абстрактным классом, но с небольшими особенностями.
Особенности интерфейса:
- интерфейс не может содержать методы с реализацией и свойства
- интерфейс реализуется (implements), а абстрактный класс наследуется (extends)
- наследовать мы можем только 1 класс, а реализовать сколько угодно интерфейсов
Пример интерфейсов с множественным наследованием:
Скорее всего у вас возник вопрос:
Зачем нам нужен интерфейс, если можно использовать абстрактный класс?
Все дело в том, что можно унаследоваться только от одного абстрактного класса, но возможно реализовать несколько интерфейсов.
Плюс ко всему, в качестве приятного дополнения, ВСЕ методы, описанные в интерфейсе, обязательно ДОЛЖНЫ быть реализованы в классе, а в абстрактном классе их нужно для этой цели специально отмечать ключевым словом abstract.