Чат Telegram
Группа ВКонтакте
Абстрактные классы в PHP

Изучаем абстрактные классы в PHP

Представьте, как было бы круто, если бы в интерфейсе можно было бы не только объявить методы, которые нужно реализовать, но и добавить некоторую реализацию. Например, определить какой-нибудь метод, у которого будет какая-то логика. Для этого в PHP есть абстрактные классы.

Выглядит определение абстрактного класса следующим образом:

abstract class AbstractClass
{
    // тело абстрактного класса
}

Давайте попробуем создать объект этого класса:

abstract class AbstractClass
{
    // тело абстрактного класса
}

$object = new AbstractClass();

Мы получим ошибку.
ошибка при создании объекта абстрактного класса

Создать объект абстрактного класса нельзя – от него можно только наследоваться. Примерно как с интерфейсами – их мы можем только реализовывать в других классах.

Такой класс может содержать абстрактные методы. По сути, это лишь объявление методов, которые должны быть реализованы в дочерних классах. Типа такого:

abstract class AbstractClass
{
    abstract public function getValue();
}

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

abstract class AbstractClass
{
    abstract public function getValue();

    public function printValue()
    {
        echo 'Значение: ' . $this->getValue();
    }
}

То есть в классах-наследниках будет доступен уже реализованный метод printValue(), который без проблем можно переопределить. Он вызывает метод getValue(), который в самом классе пока не реализован, но мы можем его использовать в других методах.

Дочерние классы будут обязаны реализовать метод getValue(). Давайте опишем класс-наследник от этого абстрактного класса.

abstract class AbstractClass
{
    abstract public function getValue();

    public function printValue()
    {
        echo 'Значение: ' . $this->getValue();
    }
}

class ClassA extends AbstractClass
{

}

Такой код вызовет ошибку – класс ClassA не реализовал в себе метод getValue().

Ошибка из-за нереализованности абстрактного метода

Давайте это исправим.

abstract class AbstractClass
{
    abstract public function getValue();

    public function printValue()
    {
        echo 'Значение: ' . $this->getValue();
    }
}

class ClassA extends AbstractClass
{
    private $value;

    public function __construct(string $value)
    {
        $this->value = $value;
    }

    public function getValue()
    {
        return $this->value;
    }
}

$objectA = new ClassA('kek');
$objectA->printValue();

Этот код вполне нормально отработает, и выведет на экран “kek”.

Присоединяйтесь к нам в ВКонтакте и в Facebook, чтобы не пропустить новые уроки. А также вступайте в наш чат PHP-разработчиков в Telegram.
Домашнее задание
Домашнее задание к этому уроку доступно только для патронов проекта.
Комментарии (59)
Отправка домашек на проверку и вопросы к уроку доступны только для патронов проекта.
Логические задачи с собеседований