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

Интерфейсы в 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 по 24.01
втрати противника
орієнтовно склали:
1233020 ( +930 ) особового складу
11603 ( +4 ) танків
23949 ( +3 ) бойових бронемашин
36580 ( +31 ) артилерійських систем
1623 ( +0 ) РСЗВ
1283 ( +1 ) засоби ППО
434 ( +0 ) літаків
347 ( +0 ) гелікоптерів
75644 ( +88 ) автомобільної техніки
28 ( +0 ) кораблі / катери
4190 ( +0 ) крилаті ракети
114049 ( +772 ) БПЛА
4050 ( +0 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
2 ( +0 ) підводні човни