Интерфейс определяет абстрактный дизайн, которому должен соответствовать применяющий его класс. Интерфейс определяет методы без реализации. А класс затем применяет интерфейс и реализует эти методы. Применение интерфейса гарантирует, что класс имеет определенный функционал, описываемый интерфейсом.
Интерфейс определяется с помощью ключевого слова 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();