A free and open-source book on ZF3 for beginners


3.3. Интерфейсы PHP

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

Интерфейсы широко распространены в Zend Framework 3. Например, класс Application реализует интерфейс ApplicationInterface, определяющий методы, которые должен иметь каждый класс приложения:

<?php 
namespace Zend\Mvc;

interface ApplicationInterface
{
    // Возвращает менеджер сервисов.
    public function getServiceManager();

    // Возвращает объект HTTP-запроса.
    public function getRequest();

    // Возвращает объект HTTP-ответа.
    public function getResponse();

    // Запускает приложение.
    public function run();
}

Как видно из примера выше, интерфейс определяется с использованием ключевого слова interface, почти так же, как определяется стандартный PHP-класс. Интерфейс, как и обычный класс, определяет методы. Однако, интерфейс не предоставляет реализацию методов. Как видно из определения интерфейса ApplicationInterface выше, каждое приложение с этим интерфейсом будет иметь метод getServiceManager() для возвращения менеджера сервисов (о менеджере сервисов мы поговорим позже в этой главе), методы getRequest() и getResponse() для возвращения соответственно HTTP-запроса и HTTP-ответа и метода run() для запуска приложения.

В Zend Framework 3 к именам интерфейсов принято добавлять суффикс Interface, например, ApplicationInterface.

Класс, реализующий интерфейс, называется конкретным классом. Конкретный класс Application реализует ApplicationInterface, что означает, что он содержит реализацию методов, определенных интерфейсом:

<?php 
namespace Zend\Mvc;

class Application implements ApplicationInterface
{
    // Реализация методов интерфейса
   
    public function getServiceManager() 
    {
        // Некая реализация...
    }

    public function getRequest() 
    {
       // Некая реализация...
    }

    public function getResponse() 
    {
       // Некая реализация...
    }

    public function run() 
    {
       // Некая реализация...
    }
}

Конкретный класс Application использует ключевое слово implements, чтобы показать, что он содержит реализацию всех методов интерфейса ApplicationInterface. Класс Application также может иметь и другие методы, которые не являются частью интерфейса.

Графически отношения классов изображаются с помощью диаграмм наследования. На рисунке 3.1 представлена такая диаграмма для класса Application. Стрелки ведут от производного класса к родительскому.

Рисунок 3.1. Диаграмма наследования класса Application Рисунок 3.1. Диаграмма наследования класса Application


Top