Когда использовать интерфейсы в PHP - PullRequest
10 голосов
/ 18 декабря 2011

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

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

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

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

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

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

1 Ответ

12 голосов
/ 18 декабря 2011

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...