Интерфейс определяет абстрактный дизайн, которому должен соответствовать применяющий его класс. Интерфейс определяет методы без реализации. А класс затем применяет интерфейс и реализует эти методы. Применение интерфейса гарантирует, что класс имеет определенный функционал, описываемый интерфейсом.
Интерфейс определяется с помощью ключевого слова interface, за которым следует имя интерфейса и блок кода интерфейса в фигурных скобках:
interface Messenger {}
Здесь определен интерфейс Messenger
. Внутри блока интерфейса в фигурных скобках определяются сигнатуры методов. Причем все эти методы могут быть только публичными, то есть с модификатором
public
, либо без модификатора доступа (что аналоично модификатору public):
interface Messenger { function send(); }
Интерфейсы могут содержать лишь сигнатуры методов - наазвания функций и список параметров в скобках, после которого идет точка с запятой.
Так, в данном случае объявлен метод send()
. Он не имеет реализации - конкретную реализацию определит класс, который реализует этот интерфейс.
Для реализации классом интерфейса применяется ключевое слово implements, после которого указывается имя применяемого интерфейса:
<?php interface Messenger { function send(); } class EmailMessenger implements Messenger { function send() { echo "Отправка сообщения на e-mail"; } } $outlook = new EmailMessenger(); $outlook->send(); ?>
В данном случае класс EmailMessenger реализует интерфейс Messenger. Если класс применяет интерфейс, то он должен реализовать все методы этого интерфейса.
Так, в данном случае класс EmailMessenger определяет метод send()
с некоторой реализацией.
Интерфейсы также могут наследоваться от других интерфейсов:
<?php interface Messenger { function send(); } interface EmailMessenger extends Messenger { } class SimpleEmailMessenger implements EmailMessenger { function send() { echo "Отправка сообщения на email."; } } $outlook = new SimpleEmailMessenger(); $outlook->send(); ?>
Когда нам могут понадобиться интерфейсы? Интерфейс - это контракт, который говорит, что класс обязательно реализует определенный функционал. И мы можем использовать это в своей программе. Например, определим следующий код:
<?php interface Messenger { function send($message); } function sendMessage(Messenger $messenger, $text) { $messenger->send($text); } class EmailMessenger implements Messenger { function send($message) { echo "Отправка сообщения на email: $message"; } } $outlook = new EmailMessenger(); sendMessage($outlook, "Hello World"); ?>
Для отправки сообщения здесь определена функция sendMessage()
, которая в качестве первого параметра принимает объект мессандера, а
в качестве второго параметра - отправляемый текст. Причем определение первого параметра говорит, что передаваемое этому параметру значение
должно реализовать интерфейс Messenger. В самой функции мы знаем, что первый параметр - это объект, который обязательно реализует интерфейс Messenger,
поэтому мы можем вызвать у него метод send()
для отправки сообщения:
function sendMessage(Messenger $messenger, $text) { $messenger->send($text); }
Класс может одновременно применять сразу несколько интерфейсов. В этом случае все интерфейсы перечисляются через запятую после слова implements. А класс должен реализовать методы всех применяемых интерфейсов:
interface Camera { function makeVideo(); function makePhoto(); } interface Messenger { function sendMessage($message); } class Mobile implements Camera, Messenger { function makeVideo(){ echo "Запись видео";} function makePhoto(){ echo "Съемка фото";} function sendMessage($message) {echo "Отправка сообщения $message";} } $iphone12 = new Mobile(); $iphone12->makePhoto();