← Назад к вопросам

Что такое реализация абстрактного класса?

2.0 Middle🔥 231 комментариев
#PHP Core#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое реализация абстрактного класса?

Абстрактный класс — это класс, который нельзя инстанцировать напрямую. Он служит шаблоном для создания других классов, определяя обязательные методы и свойства, которые должны быть реализованы в дочерних классах.

Определение абстрактного класса

abstract class AbstractClass {
    abstract public function abstractMethod(): string;
    
    public function concreteMethod(): void {
        echo "Это конкретная реализация";
    }
}

Ключевые характеристики:

  • Ключевое слово abstract — отмечает класс как абстрактный
  • Абстрактные методы — объявлены, но не реализованы
  • Конкретные методы — могут быть реализованы в самом абстрактном классе
  • Нельзя создавать экземплярыnew AbstractClass() вызовет ошибку

Реализация абстрактного класса

Реализация — это создание конкретного класса, который наследует абстрактный класс и реализует все его абстрактные методы.

abstract class Animal {
    protected string $name;
    
    public function __construct(string $name) {
        $this->name = $name;
    }
    
    abstract public function makeSound(): string;
    abstract public function move(): void;
    
    public function getName(): string {
        return $this->name;
    }
}

class Dog extends Animal {
    public function makeSound(): string {
        return "Woof!";
    }
    
    public function move(): void {
        echo $this->name . " is running";
    }
}

class Bird extends Animal {
    public function makeSound(): string {
        return "Tweet!";
    }
    
    public function move(): void {
        echo $this->name . " is flying";
    }
}

$dog = new Dog("Rex");
echo $dog->makeSound(); // Вывод: Woof!
$dog->move(); // Вывод: Rex is running

Правила реализации

Обязательные требования:

  • Дочерний класс должен реализовать все абстрактные методы
  • Методы должны иметь одинаковую сигнатуру или совместимую (контравариантность параметров, ковариантность возвращаемого типа)
  • Уровень доступа должен быть более открытым или равным (abstract public → public, но не наоборот)

Неправильная реализация:

class Cat extends Animal {
    // Ошибка: не реализованы все абстрактные методы
    public function makeSound(): string {
        return "Meow!";
    }
    // Забыли move()
}
// PHP Error: Class Cat contains 1 abstract method and must either define the remaining methods or declare itself abstract

Практический пример: Payment Gateway

abstract class PaymentProcessor {
    protected string $apiKey;
    protected float $fee = 0.03;
    
    abstract public function authorize(float $amount): bool;
    abstract public function capture(string $transactionId, float $amount): bool;
    abstract public function refund(string $transactionId): bool;
    
    public function calculateFee(float $amount): float {
        return $amount * $this->fee;
    }
}

class StripePaymentProcessor extends PaymentProcessor {
    public function authorize(float $amount): bool {
        // Stripe API call
        return true;
    }
    
    public function capture(string $transactionId, float $amount): bool {
        // Stripe capture logic
        return true;
    }
    
    public function refund(string $transactionId): bool {
        // Stripe refund logic
        return true;
    }
}

class PayPalPaymentProcessor extends PaymentProcessor {
    public function authorize(float $amount): bool {
        // PayPal API call
        return true;
    }
    
    public function capture(string $transactionId, float $amount): bool {
        // PayPal capture logic
        return true;
    }
    
    public function refund(string $transactionId): bool {
        // PayPal refund logic
        return true;
    }
}

Преимущества абстрактных классов

  • Контрактование — определяют, какие методы должны быть
  • Переиспользование кода — конкретные методы доступны всем наследникам
  • Полиморфизм — работа с абстрактным типом
  • Организация иерархии — четкая структура классов

Абстрактные классы vs Интерфейсы

Абстрактные классы:

  • Могут содержать конкретные реализации
  • Могут иметь приватные и защищенные методы
  • Используются для создания иерархии "является"

Интерфейсы:

  • Только объявления методов (с PHP 8.1+ могут быть дефолтные реализации)
  • Все методы публичные
  • Используются для определения контракта "может делать"

Вывод: реализация абстрактного класса — это создание конкретного класса, который полностью определяет все абстрактные методы и может быть инстанцирован.

Что такое реализация абстрактного класса? | PrepBro