#7.17 php ООП Абстрактные классы и методы

Абстрактным классом называется базовый класс, который является некоторым обобщением производных классов и не предполагает создание объектов. Например, класс "Геометрическая фигура" может являться обобщением классов "Круг", "Треугольник", "Четырехугольник". А класс "Четырехугольник" — обобщением классов "Прямоугольник", "Ромб", "Трапеция". Для создания абстрактного класса используется ключевое слово abstract перед определением класса:

<?php
abstract class Figure
{
}

Абстрактный класс объединяет в себе свойства и методы общие для всех его наследников. Например, для каждой геометрической фигуры можно вычислить её площадь. Соответствующий метод get_area() можно определить в базовом классе следующим образом:

<?php
abstract class Figure
{
    protected function get_area() {}
}

При этом реализация метода get_area в классе Figure отсутствует, и мы ожидаем, что в каждом из производных классов будет представлен собственный вариант вычисления площади.

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

<?php
abstract class Figure
{
    abstract protected function get_area();
}

Теперь, если какой-то класс наследует класс Figure, он обязательно должен будет представить некоторую реализацию метода get_area, например,

class Circle extends Figure
{
    private $r;

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

    protected function get_area()
    {
        return 2*pi()*($this->r)**2;
    }      
}

Взаимосвязь между абстрактными классами и абстрактными методами

  • Абстрактные методы могут содержаться только в абстрактных классах. Если мы пропустим abstract при объявлении класса Figure
    <?php
    class Figure
    {
        abstract protected function get_area();
    }
    

    то получим ошибку:

    Fatal error: Class Figure contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Figure::get_area) 
  • Абстрактные классы могут содержать как абстрактные, так и обычные методы, например,
    <?php
    abstract class Figure
    {
        abstract protected function get_area();
    
        public function print_area()
        {
            echo "Площадь фигуры = ", $this->get_area();
        }
    }
    

Key Words for FKN + antitotal forum (CS VSU):