Абстрактные классы и методы

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

Абстрактный класс представляет частичную реализацию для классов-наследников.

Абстрактный класс определяется с помощью модификатора abstract, который ставится перед именем класса:

abstract class Messenger { }

Одной из ключевых особенностей абстрактных классов является то, что мы не можем напрямую создать объекты абстрактного класса с помощью вызова его конструктора:

abstract class Messenger { }
$telegram = new Messenger();	// эта строка не будет работать

Абстрактные классы, как и обычные классы, могут определять переменные и константы, методы и конструкторы.

Но другой особенностью абстрактных классов является то, что они могут содержать абстрактные методы. Это методы, которые не имеют реализации. Реализацию для них предоставляют классы-наследники. Например:

abstract class Messenger
{
	abstract function send($message);	// абстрактный метод
}

При определении абстрактного метода перед словом function ставится модификатор abstract. А после списка параметров метода - точка с запятой.

Абстрактные методы могут размещаться только в абстрактных классах. Обычный неабстрактный класс не может иметь абстрактных методов.

Если неабстрактный класс наследуется от абстрактного класса, то он обязан реализовать все его абстрактные методы.

Для наследования классом абстрактного класса, как и в общем случае при наследовании, применяется ключевое слово extends. Например:

<?php
abstract class Messenger
{
	protected $name;
	function __construct($name)
	{ 
		$this->name = $name;
	}
	abstract function send($message);
	function close()
	{
		echo "Выход из мессенджера...";
	}
}

class EmailMessenger extends Messenger 
{
	function send($message)
	{
		echo "$this->name отправляет сообщение: $message<br>";
	}
}
$outlook = new EmailMessenger("Outlook");
$outlook->send("Hello PHP 8");
$outlook -> close();
?>

В данном случае класс EmailMessenger наследуется от абстрактного класса Messenger.

Абстрактный класс определяет абстрактный метод send(), поэтому класс-наследник EmailMessenger должен предоставить реализацию для этого метода.

Так, в данном случае мы получим следующий вывод:

Outlook отправляет сообщение: Hello PHP 8
Выход из мессенджера...

Можно заметить, что абстрактные классы похожи на интерфейсы - и те, и другие могут определять методы без реализации, которые реализуются в других классах. Однако, абстрактные классы, как и обычные классы, могут иметь переменные, неабстрактные методы, конструкторы с реализацией, а интерфейсы нет. Кроме того, в PHP один класс может наследоваться только от одного класса, тогда как один класс может применять сразу несколько интерфейсов.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850