Интерфейсы в PHP. Как обязать класс реализовывать функционал?

интерфейсы в php. как обязать класс реализовывать функционал?

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

Представьте, что вы пишете сложную программу, и некоторые её классы могут взаимодействовать друг с другом. Например, класс Garage (англ. Автомобильный гараж) мог бы принимать и ремонтировать автомобили. Для ремонта нужно открыть капот, снять колеса и т.д.

Снять колеса легковушке не то же самое, что сделать это для грузовика. Поэтому мы не можем создать родительский класс Car (англ. автомобиль), поместить в него реализации методов openHood() и removeWheels(), а затем наследовать от него классы конкретных типов автомобилей. Для каждого типа автомобиля нужен свой программный код.

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

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

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

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

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

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

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

//Определение интерфейса "Мобильный телефон"
interface MobilePhone
{
    //Определение методов интерфейса
    public function openBrowser();
    public function makePhoto();
    public function playMysic();
}

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

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

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

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

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

//Интерфейс "Персонального компьютера"
interface PersonalComputer
{
    //Определения метода включения
    public function workStart($userName);
}

//Класс "Ноутбук" реализующий интерфейс
class Notebook implements PersonalComputer
{
    public function workStart($userName)
    {
        echo "Добро пожаловать {$userName}";
    }
}

Последние публикации