Зачем нужны абстрактные классы и интерфейсы в php?
Прочитал кучу вопросов и статей, но повторю этот вопрос, который задавали до меня тысячи, а возможно десятки и сотни тысяч раз, снова:
Зачем нужны абстрактные классы и интерфейсы? И в php тоже.
Я понимаю так: абстрактный класс позволяет декларировать методы для дочерних классов, также не определять в классе наследнике методы родителя, и что по сути от обычного класса он отличается тем, что в названии некоторых методов и названии класса есть приписка "abstract" и что нельзя создать его экземпляр. Вопрос: зачем тогда он вообще нужен?
Как я понимаю, он (абстрактный класс) носит чисто декоративный характер, нужен для ограничения действий разработчика, удобства разработки и вообще это лишь "сахар".
Та же тема с интерфейсами. Зачем они нужны, если потом их методы и свойства будут переопределяться? А если не будут, то чем хуже наследование от обычного родительского класса, где так же можно определить свойства и методы, но опустить реализацию?
Есть ещё трейты, но с ними более-менее понятно. Чтобы не плодить классы родители и от них каждый раз не перенаследоваться, создавая при этом огромные цепочки наследований, используются трейты, в которых определяется метод, который есть в классе родителе, и потом трейт подключается к классу наследнику, переопределяет родительский метод и нет лишней возни.
Так и зачем нужны абстрактные классы и интерфейсы?
Nikolay Petyukh, а когда мы на ты перешли, уважаемый? Меня просто утомляют такие ответы, где порой ответ по ссылке не подходит для вопроса, как и в этом случае.
Окей, допустим на основной вопрос ответили. Теперь читайте дальше заголовка и попробуйте ответить на конкретные вопросы конкретными ответами.
Честь? При чем тут честь? Каждый вопрос по своему уникален, для каждого вопроса нужен уникальный ответ, потому бросание линками без дополнения к ответу — вот что бесчестно.
Максим Федоров, вам не за что извиняться, это проблема всего комьюнити.
халатное отношение порождает недопонимание, и, следовательно говнокод.
а я не хочу быть говнокодером, потому в ответе кроме ссылке ожидаю хотя бы дополнение и пояснение по поводу каких-то отдельных аспектов вопроса.
OnYourLips, и какой вывод я должен сделать? что я все правильно понял, и абстрактные классы и интерфейсы - это ограничения, сахар и удобство разработки? или нет?
1) Пишем какую-то функцию, которая принимает в качестве аргумент интерфейс.
2) Функция работает с методами интерфейса и получает какой-то результат.
3) Где-то есть отдельная логика, выбора конкретной реализации класса, который выполняет интерфейс.
Т.е. допустим, у нас есть онлайн-касса и есть 20 методов платежей. Сама онлайн-касса работает с интерфейсом проводки платежа, а как проводить платежи реализовано в конкретных классах платежных систем.
Из минусов, иногда приходиться весьма "изящно" натягивать вещи, которые не очень ложатся на методы интерфейса, чтобы доп-функциональность работала согласно "верному пути" архитектора.
___
Абстрактный класс. ну допустим, мы далем абстрактный класс DTO, который выполняет методы to_string и normalize. Наследуюясь от этого абстрактного класса, мы во всех DTO получаем методы to_string и normalize. Плюс защищаемся от того, что кто-то решит нам запороать этот абстрактный класс, либо "решит" что-то сломать в своем DTO
___
Ну вообще, это все нужно, если ты пишешь хороший проект на Symfony командой. Если это какой-то бложит или небольшой новостник, тебе это все не нужно.