Задать вопрос
@dasauser
Пишу на PHP

Зачем нужны абстрактные классы и интерфейсы в php?

Прочитал кучу вопросов и статей, но повторю этот вопрос, который задавали до меня тысячи, а возможно десятки и сотни тысяч раз, снова:
Зачем нужны абстрактные классы и интерфейсы? И в php тоже.
Я понимаю так: абстрактный класс позволяет декларировать методы для дочерних классов, также не определять в классе наследнике методы родителя, и что по сути от обычного класса он отличается тем, что в названии некоторых методов и названии класса есть приписка "abstract" и что нельзя создать его экземпляр. Вопрос: зачем тогда он вообще нужен?
Как я понимаю, он (абстрактный класс) носит чисто декоративный характер, нужен для ограничения действий разработчика, удобства разработки и вообще это лишь "сахар".
Та же тема с интерфейсами. Зачем они нужны, если потом их методы и свойства будут переопределяться? А если не будут, то чем хуже наследование от обычного родительского класса, где так же можно определить свойства и методы, но опустить реализацию?
Есть ещё трейты, но с ними более-менее понятно. Чтобы не плодить классы родители и от них каждый раз не перенаследоваться, создавая при этом огромные цепочки наследований, используются трейты, в которых определяется метод, который есть в классе родителе, и потом трейт подключается к классу наследнику, переопределяет родительский метод и нет лишней возни.
Так и зачем нужны абстрактные классы и интерфейсы?
  • Вопрос задан
  • 12739 просмотров
Подписаться 15 Простой 12 комментариев
Решение пользователя Сергей Нижний Новгород К ответам на вопрос (12)
С интерфейсами самый простой кейс:

1) Пишем какую-то функцию, которая принимает в качестве аргумент интерфейс.
2) Функция работает с методами интерфейса и получает какой-то результат.
3) Где-то есть отдельная логика, выбора конкретной реализации класса, который выполняет интерфейс.

Т.е. допустим, у нас есть онлайн-касса и есть 20 методов платежей. Сама онлайн-касса работает с интерфейсом проводки платежа, а как проводить платежи реализовано в конкретных классах платежных систем.

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

___

Абстрактный класс. ну допустим, мы далем абстрактный класс DTO, который выполняет методы to_string и normalize. Наследуюясь от этого абстрактного класса, мы во всех DTO получаем методы to_string и normalize. Плюс защищаемся от того, что кто-то решит нам запороать этот абстрактный класс, либо "решит" что-то сломать в своем DTO

___

Ну вообще, это все нужно, если ты пишешь хороший проект на Symfony командой. Если это какой-то бложит или небольшой новостник, тебе это все не нужно.
Ответ написан
Комментировать