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