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

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

Пример создания и реализации интерфейса на php php ООП

В продолжении темы объектно-ориентированного программирования, начатой в предыдущей статье Абстрактные классы в 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 "Меняем поврежденные элементы кольчуги";
    }
} 
Предыдущая заметка Абстрактные классы в php
Следующая заметка Верстка витрины

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

Міністерство оборони
України
з 24.02 по 17.07
втрати противника
орієнтовно склали:
562510 ( +1110 ) особового складу
8238 ( +11 ) танків
15871 ( +9 ) бойових бронемашин
15411 ( +43 ) артилерійських систем
1120 ( +1 ) РСЗВ
893 ( +1 ) засоби ППО
361 ( +0 ) літаків
326 ( +0 ) гелікоптерів
20741 ( +61 ) автомобільної техніки
28 ( +0 ) кораблі / катери
2398 ( +0 ) крилаті ракети
12224 ( +31 ) БПЛА
2586 ( +9 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
1 ( +0 ) war.submarines

Поиск