← Назад к вопросам
Что такое реализация абстрактного класса?
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+ могут быть дефолтные реализации)
- Все методы публичные
- Используются для определения контракта "может делать"
Вывод: реализация абстрактного класса — это создание конкретного класса, который полностью определяет все абстрактные методы и может быть инстанцирован.