Интерфейсы в 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
. Стрелки
ведут от производного класса к родительскому.