Когда использовать интерфейсы в PHP

Мне всегда было трудно понять реальную ценность интерфейсов при кодировании с объектами в PHP (могли бы быть другие языки, которые я себе представляю)

Насколько я понимаю, вы используете Interface для обеспечения соблюдения или гарантии того, что, когда класс использует Interface , этот класс будет иметь методы, определенные в Interface внутри этого класса.

Итак, из-за моего знания использования их, не означает ли это, что вы только найдете Interface полезным при определении более 1 класса, который нуждается в этих методах?

Чтобы быть более ясным, если у меня есть класс, который делает что-то одно, и никакие другие классы не должны делать такие вещи, тогда было бы бессмысленно использовать Interface этого класса?

Таким образом, вы не будете использовать Interface на КАЖДОМ классе, который вам подходит?

PS) Если вы проголосуете за этот вопрос как exact duplicate вы не прочитали вопрос и только заголовок, поскольку я прочитал большинство подобных вопросов уже

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

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

 function feed(IAnimal $interface) { // ... } 

(альтернативно, в качестве примера также будет использована «фабричная» функция, которая документирована для возврата экземпляра, который реализует IAnimal ).

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

Другими словами, интерфейсы служат для абстрагирования контракта (интерфейса) от конкретной реализации (классов). Это дает разработчикам конкретных классов бесплатную руку для изменения, переименования, удаления и добавления реализаций без нарушения кода для пользователей интерфейса, что невозможно, если вы ссылаетесь на конкретные классы непосредственно в вашем API.

Что касается интерфейса, который реализуется только одним классом: этого недостаточно, чтобы решить. Если в будущем, возможно, будет больше реализаций интерфейса, то это, безусловно, имеет смысл (например: интерфейс IHashFunction имеет смысл, даже если Sha1HashFunction настоящее время является единственной доступной реализацией). В противном случае он ничего не предлагает.