Какой смысл интерфейсов в PHP? - PullRequest
212 голосов
/ 21 августа 2008

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

Абстрактные классы позволяют вам делать то же самое, наряду с добавлением кода в метод.

Теперь, если вы можете достичь той же цели с помощью абстрактных классов, зачем нам вообще нужна концепция интерфейсов?

Мне сказали, что это связано с теорией ОО от C ++ до Java, на которой основаны ООП в PHP. Является ли концепция полезной в Java, но не в PHP? Это просто способ избежать засорения заполнителей в абстрактном классе? Я что-то упустил?

Ответы [ 15 ]

3 голосов
/ 21 августа 2008

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

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

Конечно, идея о многоинтерфейсной реализации также является обоснованной. Если у вас есть класс, который реализует несколько интерфейсов, вы можете использовать объект этого класса как разные типы в одном приложении.

Тот факт, что ваш вопрос касается PHP, делает вещи немного более интересными. Печатание на интерфейсах все еще не является чрезвычайно необходимым в PHP, где вы можете в значительной степени передать любой метод, независимо от его типа. Вы можете статически набирать параметры метода, но некоторые из них не работают (я думаю, что String вызывает некоторые сбои). Сопоставьте это с тем фактом, что вы не можете печатать большинство других ссылок, и нет особой ценности в попытках принудительной статической типизации в PHP ( на данный момент ). И поэтому значение интерфейсов в PHP , на данный момент намного меньше, чем в более строго типизированных языках. Они имеют преимущество читабельности, но мало что еще. Множественная реализация даже не выгодна, потому что вам все равно нужно объявлять методы и предоставлять им тела в реализаторе.

2 голосов
/ 27 сентября 2018

Интерфейсы похожи на ваши гены.

Абстрактные занятия похожи на ваших настоящих родителей.

Их цели наследственные, но в случае абстрактных классов и интерфейсов то, что наследуется, более конкретно.

1 голос
/ 05 апреля 2019

Я не знаю о других языках, какова концепция интерфейса там. Но для PHP я постараюсь объяснить это. Просто наберитесь терпения и, пожалуйста, прокомментируйте, если это помогло.

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

Правило

  1. Интерфейс не может быть создан.

  2. Вы не можете реализовать какой-либо метод в интерфейсе, т.е. он содержит только подпись метода, но не детали (тело).

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

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

Теперь давайте рассмотрим пример. Предположим, у нас есть две игрушки: одна - собака, а другая - кошка.

Как мы знаем, собака лает, а кошка мяукает. У этих двоих одинаковый метод разговора, но с разной функциональностью или реализацией. Предположим, мы даем пользователю пульт дистанционного управления с кнопкой разговора.

Когда пользователь нажимает кнопку «говорить», игрушка должна говорить, не важно, собака это или кошка.

Это хороший случай, чтобы использовать интерфейс, а не абстрактный класс, потому что реализации разные. Зачем? Помните

Если вам нужно поддержать дочерние классы, добавив неабстрактный метод, вы должны использовать абстрактные классы. В противном случае интерфейс будет вашим выбором.

1 голос
/ 16 февраля 2018

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

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

2.Все методы в интерфейсе должны быть видны public Объем.

3. Класс может реализовывать более одного интерфейса, в то время как он может наследовать только из одного абстрактного класса.

                                  interface                      abstract class
the code                     - abstract methods               - abstract methods
                             - constants                      - constants                  
                                                              - concrete methods
                                                              - concrete variables

access modifiers             
                             - public                         - public
                                                              - protected
                                                              - private
                                                                etc.
number of parents          The same class can implement
                           more than 1 interface              The child class can 
                                                              inherit only from 1 abstract class

Надеюсь, это поможет любому понять!

1 голос
/ 12 января 2017

Ниже приведены пункты для интерфейса PHP

  1. Он используется для определения обязательных методов в классе [если вы хотите загрузить html, тогда требуется идентификатор и имя, поэтому в этом случае интерфейс включает setID и setName].
  2. Интерфейс строго заставляет класс включать все методы, определенные в нем.
  3. Вы можете определить метод только в интерфейсе с общедоступной доступностью.
  4. Вы также можете расширить интерфейс, как класс. Вы можете расширить интерфейс в php, используя ключевое слово extends.
  5. Расширение нескольких интерфейсов.
  6. Вы не можете реализовать 2 интерфейса, если оба имеют одну и ту же функцию. Это выдаст ошибку.

Пример кода:

interface test{
    public function A($i);
    public function B($j = 20);
}

class xyz implements test{
    public function A($a){
        echo "CLASS A Value is ".$a;
    }
    public function B($b){
        echo "CLASS B Value is ".$b;
    }
}
$x = new xyz();
echo $x->A(11);
echo "<br/>";
echo $x->B(10);
...