Слава Україні!

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

Пример создания и реализации интерфейса на php
27-го грудня 2017, 1:12

В продолжении темы объектно-ориентированного программирования, начатой в предыдущей статье Абстрактные классы в php рассмотрим интерфейсы.

Представьте, что некоторые классы могут взаимодействовать друг с другом. Например, класс Smithy (кузница) мог бы принимать и ремонтировать броню и оружие.

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

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

Классу Smithy все равно, с какой экипировкой взаимодействовать, лишь бы у него были методы repairWeapon() и repairArmor(). Их отсутствие вызовет фатальную ошибку при первой попытке вызова. Если же классы конкретных типов снаряжения реализуют интерфейс, то он обязывает их иметь соответствующие методы.

Определение интерфейса

В PHP определение интерфейса происходит аналогично обычному классу, с заменой ключевого слова `class` на `interface`. Выражение в общем виде можно записать как `interface ИмяИнтерфейса {/* определение методов */}`.

Правила определения интерфейсов:

  • Он имеет только поведение, поэтому не допускается добавление свойств.
  • Все методы должны быть открытыми и иметь модификатор public.
  • Методы не должны иметь реализации. В их определение входит только модификатор доступа public, имя и список параметров. Сразу за круглыми скобками параметров находится точка с запятой.

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


//Определение интерфейса "кузница"
interface Smithy
{
    //Определение методов интерфейса
    public function repairWeapon();
    public function repairArmor();
} 
Существование интерфейсов в PHP может показаться бессмысленным. Какой толк создавать их и прикреплять к классам, если их методы не реализуют никакого функционала? Ответ очень прост. Интерфейс гарантирует, что класс имеет реализацию метода. Если прикрепить к конкретному классу интерфейс, но забыть написать требуемые для него методы, программный код завершится фатальной ошибкой.

Реализация интерфейса

Чтобы PHP интерпретатор узнал о связи класса с интерфейсом нужно использовать ключевое слово `implements`. Выражение можно записать как `class ИмяКласса implements ИмяИнтерфейса {/* определение свойств и методов */}`. Допустимо указание нескольких интерфейсов через запятую.

После создания связи, необходимо добавить реализации требуемых методов. Они могут быть пустыми. Обязательными условиями являются:

  • модификатор доступа public
  • полное совпадение имени и списка параметров метода. Если метод, указанный в интерфейсе, определяет три параметра, а в классе указано только два, программный код завершится с ошибкой

//Интерфейс "кузница"
interface Smithy
{
    public function repairWeapon();
    public function repairArmor();
}

//Класс "Орк" реализующий интерфейс
class Orc implements Smithy
{
    public function repairWeapon(){
        echo "Точим двуручный меч";
    }

    public function repairArmor(){
        echo "Меняем поврежденные элементы кольчуги";
    }
} 

Важлива інформація

Міністерство оборони
України
з 24.02 по 18.03
втрати противника
орієнтовно склали:
897010 ( +1560 ) особового складу
10352 ( +8 ) танків
21509 ( +20 ) бойових бронемашин
24640 ( +42 ) артилерійських систем
1319 ( +1 ) РСЗВ
1107 ( +3 ) засоби ППО
370 ( +0 ) літаків
331 ( +0 ) гелікоптерів
40892 ( +107 ) автомобільної техніки
28 ( +0 ) кораблі / катери
3121 ( +0 ) крилаті ракети
29616 ( +149 ) БПЛА
3780 ( +2 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
1 ( +0 ) підводні човни