что такое интерфейс php

Интерфейсы в PHP

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

Интерфейс может быть реализован в классе, правильно использовать именно это слово — «реализован», а не слово «унаследован».

Давайте расмотрим пример объявления интерфейса с именем Planes (самолёты) и его реализацию в классе Boing.

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

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

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

Интерфейсы в PHP кроме списка методов, также могут содержать константы.

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

Вот пример реализации в классе Boing двух интерфейсов:

Мы видим что реализуемые интерфейсы просто перечесляются через запятую:

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

У интерфейсов есть ещё одно полезное свойство, они присваивают объектам дополнительный тип.

Философия интерфейсов и абстрактных классов

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

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

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

Источник

Интерфейсы в PHP

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

Что такое интерфейс?

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

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

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

Пример

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

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

Пример

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

Как реализовать интерфейс?

Пример

В приведенном ниже примере мы создадим интерфейс для классов, управляющих автомобилями, который передает все свои методы setModel() и getModel() классам, реализующим интерфейс:

Пример

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

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

Пример

Результат выполнения кода:

Реализация нескольких интерфейсов

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

В следующем примере класс MyClass реализовывает два интерфейса, разделенных запятыми в объявлении. При этом мы должны объявить все абстрактные методы внутри созданного класса:

Пример

Результат выполнения кода:

Как расширить класс и реализовать интерфейс?

Класс может расширять класс, а также реализовывать один или несколько интерфейсов:

Пример

Результат выполнения кода:

Примечание: Вы можете расширить только один класс, в то же время вы можете реализовать несколько интерфейсов.

Расширение интерфейсов

Интерфейсы также могут расширять интерфейсы:

Пример

Разница между абстрактным классом и интерфейсом

В таблице приведены несколько важных различий между абстрактным классом и интерфейсом:

интерфейсабстрактный класс
код— абстрактные методы
— константы
— абстрактные методы
— константы
— конкретные методы
— конкретные переменные
модификаторы доступа— публичные— публичные
— защищенные
количество родителейОдин и тот же класс может реализовывать более 1 интерфейсаДочерний класс может наследовать только от 1 абстрактного класса

Заключение

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

Источник

Интерфейсы объектов

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

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

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

implements

Для реализации интерфейса используется оператор implements. Класс должен реализовать все методы, описанные в интерфейсе; иначе произойдет фатальная ошибка. При желании классы могут реализовывать более одного интерфейса за раз, реализуемые интерфейсы должны разделяться запятой.

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

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

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

Константы (Constants)

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

Примеры

Пример #1 Пример интерфейса

Пример #2 Расширяемые интерфейсы

interface a
<
public function foo ();
>

// Это сработает
class c implements b
<
public function foo ()
<
>

// Это не сработает и выдаст фатальную ошибку
class d implements b
<
public function foo ()
<
>

Пример #3 Множественное наследование интерфейсов

interface a
<
public function foo ();
>

interface b
<
public function bar ();
>

class d implements c
<
public function foo ()
<
>

public function bar ()
<
>

Пример #4 Интерфейсы с константами

interface a
<
const b = ‘Константа интерфейса’ ;
>

// Выведет: Константа интерфейса
echo a :: b ;

// Вот это, однако, не будет работать, так как
// константы перекрывать нельзя.
class b implements a
<
const b = ‘Class constant’ ;
>
?>

Интерфейс, совместно с контролем типов, предоставляет отличный способ проверки того, что определенный объект содержит определенный набор методов. Смотрите также оператор instanceof и контроль типов.

Источник

Интерфейсы в PHP

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

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

Константы класса

Число Пи мы здесь задали в переменную, однако для таких вот постоянных вещей, которые в процессе работы программы не изменяются, лучше использовать константы. Они определяются с помощью слова const. Вот так:

Константы принято задавать в самом начале класса и называть их CAPS-ом с подчеркушками. Вот примеры того, как могут называться константы: DB_NAME, COUNT_OF_OBJECTS.

Давайте вынесем число Пи в константу.

Теперь мы можем использовать её и в других методах. Или даже в других классах, обратившись к ней через Circle::PI.

Интерфейсы

Окей, разобрались с константами и имеем в итоге 3 класса, описывающих геометрические фигуры и реализацию для вычисления их площадей. Если присмотреться, то мы видим, что во всех классах определён метод calculateSquare(), возвращающий float. Можно сказать, что у них есть что-то общее.

Допустим, мы хотели бы, чтобы у нас были фигуры, которые умеют считать свою площадь. То есть, говоря чуть более абстрактно, какие-то наши классы обязаны реализовать какой-то внешний интерфейс, а именно – иметь метод calculateSquare(), который всегда возвращает float.
Для этой задачи в PHP есть интерфейсы. Это такие «контракты», которые класс должен соблюдать, если он на это «подписался». А говоря языком программистов, классы могут реализовывать интерфейсы.

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

Чтобы обязать класс реализовать этот интерфейс нужно использовать слово implements после имени класса.

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

IDE PhpStorm автоматически понимает, что наш класс реализует интерфейс и рисует слева от методов специальные иконки. Если по ним кликнуть, то нас перекинет на интерфейс.
что такое интерфейс php. Смотреть фото что такое интерфейс php. Смотреть картинку что такое интерфейс php. Картинка про что такое интерфейс php. Фото что такое интерфейс php

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

Если же мы напишем, что класс реализует какой-то интерфейс, но не реализуем его, то получим ошибку. Об этом нам даже подскажет IDE. Давайте удалим метод calculateSquare() из класса Circle. IDE любезно подчеркнёт красным строку, в которой мы говорим, что класс реализует интерфейс.
что такое интерфейс php. Смотреть фото что такое интерфейс php. Смотреть картинку что такое интерфейс php. Картинка про что такое интерфейс php. Фото что такое интерфейс php

Если же мы попробуем запустить этот код, то и вовсе словим фатальную ошибку.
что такое интерфейс php. Смотреть фото что такое интерфейс php. Смотреть картинку что такое интерфейс php. Картинка про что такое интерфейс php. Фото что такое интерфейс php

Так что давайте этот метод вернём обратно =)

Что ещё стоит сказать об интерфейсах – один интерфейс может содержать требования по реализации нескольких методов. Они просто перечисляются один за другим, вот так:
interface CalculateSquare

Но мы пока ограничимся одним методом calculateSquare().

Окей, так для чего это всё?

В программировании зачастую требуется проверить, что перед нами сейчас какой-то конкретный тип объектов, то есть что перед нами экземпляр какого-то класса, либо что этот объект реализует какой-то интерфейс. Для этого используется конструкция instanceof. С её помощью можно понять, является ли объект экземпляром какого-то класса, или реализует интерфейс. Эта конструкция возвращает true или false.

И снова всё верно, он не является экземпляром класса Rectangle.

А теперь давайте проверим, является ли он объектом, класс которого реализует интерфейс CalculateSquare.

Вуаля! Теперь мы перед тем как попросить какой-либо объект посчитать свою площадь, можем проверить, есть ли у него такой метод, то есть, реализует ли он соответствующий интерфейс.
Давайте добавим во все наши классы информацию о том, что они реализуют интерфейс CalculateSquare.

Давайте теперь насоздаём объектов этих классов и положим их в массив:

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

Давайте теперь уберём из класса Rectangle упоминание о том, что он реализует этот интерфейс.
class Rectangle

И снова попробуем запустить код.

Как видим, проверка успешно отработала и объект класса Rectangle был пропущен.

Полный код, полученный в ходе урока:

На этом с интерфейсами пока всё. В домашке будет ещё одна интересная функция, которая позволит вам узнать об объектах ещё кое-что.

Источник

Интерфейсы в PHP

что такое интерфейс php. Смотреть фото что такое интерфейс php. Смотреть картинку что такое интерфейс php. Картинка про что такое интерфейс php. Фото что такое интерфейс php

В этой статье мы продолжим заниматься возможностями по ООП, которые нам предоставляет PHP. И в этот раз разберём тему интерфейсов в PHP. Если кто-то изучал C++, то те знают, что там существует множественное наследование. То есть, когда один класс наследует сразу несколько других классов. На мой взгляд, это создаёт жуткую путаницу. Поэтому было принято решение: в PHP отказаться от множественного наследования. Однако, компенсировать это как-то было надо, и тогда придумали интерфейсы. Кстати, те, кто знает Java, поймут, о чём идёт речь, так как там тоже нет множественного наследования, но имеются интерфейсы. А о том, как использовать интерфейсы в PHP я расскажу в этой статье.

Давайте разберём простой пример, создав следующий интерфейс (в файле «fileinterface.php«):

То есть данный интерфейс просто описывает работу с файлом. Соответственно, те объекты, которые должны читать из файла и записывать различные данные, обязаны реализовать интерфейс «FileInterface«.

Создадим ещё один интерфейс (в файле «client.php«):

Данный интерфейс реализует функцию клиента, то есть можно что-то купить (задаётся $id), а также что-то возвратить обратно (тоже задаётся по $id).

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

И, наконец, простой пример, который использует класс Shop:

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

Вот и всё, что хотелось сказать по интерфейсам в PHP.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *