Абстрактные abstract классы и методы
Абстрактный класс, нужен когда нужно семейство классов, у которых есть много общего но при этом некоторые методы отличаются реализацией или логикой. Попытка создать объект от абстрактного класса вызовет ошибку, а вот унаследоваться от абстрактного класса будет можно. Основная особенность абстрактных классов в их абстрактных метадах, такие методы не должны иметь реализации, а нужны для того, чтобы указать, что такие методы должны быть у потомков.
Особенности абстрактных классов
- Нельзя создать объект абстрактного класса
- У абстрактного класса могут быть методы и свойства
- Расширятся классом наследником
- Есть абстракные методы без реализации в абстракном классе, но которые обязательно должны быть реализованы в классе наследнике
Абстрактный класс определяется с помощью модификатора abstract
, который ставится перед именем класса:
abstract class Messenger {
}
Одной из ключевых особенностей абстрактных классов является то, что мы не можем напрямую создать объекты абстрактного класса с помощью вызова его конструктора:
abstract class Messenger {
}
// попытка создать обьект, приведет к ошибки
$telegram = new Messenger();
Абстрактные классы, как и обычные классы, могут определять переменные и константы, методы и конструкторы.
Особенностью абстрактных классов является то, что они могут содержать абстрактные методы. Это методы, которые не имеют реализации в абстрактном классе. Реализацию для них предоставляют классы наследники:
abstract class Messenger {
// абстрактный метод
abstract function send();
}
При определении абстрактного метода перед словом function
ставится модификатор abstract
. Сразу после метода, точка с запятой.
Абстрактные методы могут размещаться только в абстрактных классах. Обычный неабстрактный класс не может иметь абстрактных методов.
Если неабстрактный класс наследуется от абстрактного класса, то он обязан реализовать все его абстрактные методы.
Для наследования обычным классом абстрактного класса, как и в общем случае при наследовании, применяется ключевое слово extends
:
<?
// абстрактный класс
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 один класс может наследоваться только от одного класса, тогда как один класс может применять сразу несколько интерфейсов.