Интерфейсы

Последнее обновление: 22.03.2021

Интерфейс определяет абстрактный дизайн, которому должен соответствовать применяющий его класс. Интерфейс определяет методы без реализации. А класс затем применяет интерфейс и реализует эти методы. Применение интерфейса гарантирует, что класс имеет определенный функционал, описываемый интерфейсом.

Интерфейс определяется с помощью ключевого слова 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(); 
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850