PHP: как создать интерфейс и для чего они нужны?

· PHP и Блог · 3 мин чтения

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

Для чего нужны интерфейсы

  • интерфейсы — это 100% абстрактные классы, у котором есть методы, но в них нет никакой логики, то есть являются пустышками.
  • они не могут быть инициализированы как обычные классы. Их основная задача — это быть конструктором для класса(-ов), задавая нужную структура

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

Пример класса

<?php

class Apple
{
    public function getName()
    {
        return 'яблоко';
    }

    public function getShape()
    {
        return 'круглый';
    }
}

Теперь у нас есть класс, который называется Apple (Яблоко) и внутри метод getName(), для получения имени фрукта и getShape() для получения его формы (круглый). В дальнейшем у вас может быть много фруктов и чтобы не забывать для каждого из них указывать эти методы — можно создать интерфейс, который будет  выводить ошибку каждый раз когда мы забудете указать тот или иной метод.

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

<?php 
interface Fruit {
  /**
   * Получить название фрукта. 
   * @return string
   */
  public function getName(); 

  /**
   * Получить форму фрукта. 
   * @return string
   */
  public function getShape();
}

Интерфейсы начинаются с ключевого слова interface и далее название интерфейса. В этом примере — это Fruit (фрукт). Теперь все классы, которые будут унаследовать этот интерфейс должны включать в себя методы getName() и getShape().

Давайте теперь возьмем Apple и свежесозданным интерфейсом:

<?php

class Apple implements Fruit
{
    public function getName()
    {
        return 'яблоко';
    }

    public function getShape()
    {
        return 'круглый';
    }
}

interface Fruit
{
    /**
     * Получить название фрукта.
     * @return string
     */
    public function getName();

    /**
     * Получить форму фрукта.
     * @return string
     */
    public function getShape();
}

Работает это следующим образом: у вас есть класс, который имлементирует Fruit интерфейс. Внутри него указаны какие методы должны быть у класса, которые будет его использовать. И если какой-то из них будет упущен, тогда PHP выдаст Exception (ошибку) и укажет что именно не так.

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

<?php
class Orange implements Fruit
{
    public function getName()
    {
        return 'апельсин';
    }
}

И теперь попробуйте открыть файл с этим классом. У вас должно вывести следующую ошибку:

PHP Fatal error:  Class Orange contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Fruit::getShape) in Orange.php on line 22
PHP Stack trace:
PHP   1. {main}() Orange.php:0

Ошибка понятным языком описывает, что у вас отсутствует метод getShape(), которые обязателен при использовании Fruit интерфейса.

Послесловие

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