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

Что такое абстрактный класс и чем он отличается от интерфейса в PHP?

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

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

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

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

Абстрактные классы и интерфейсы в PHP

В объектно-ориентированном программировании PHP и абстрактные классы, и интерфейсы являются инструментами для достижения полиморфизма и определения контрактов, но они служат разным целям и имеют существенные различия.

Абстрактный класс

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

abstract class Animal {
    // Обычное свойство с реализацией
    protected string $name;
    
    // Конструктор - абстрактный класс МОЖЕТ иметь конструктор
    public function __construct(string $name) {
        $this->name = $name;
    }
    
    // Абстрактный метод - БЕЗ реализации
    abstract public function makeSound(): string;
    
    // Обычный метод - С реализацией
    public function getName(): string {
        return $this->name;
    }
}

class Dog extends Animal {
    // Обязательная реализация абстрактного метода
    public function makeSound(): string {
        return "Гав!";
    }
}

Интерфейс

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

interface Loggable {
    // Только сигнатуры методов, без реализации
    public function log(string $message): void;
    public function getLogs(): array;
}

class FileLogger implements Loggable {
    private array $logs = [];
    
    public function log(string $message): void {
        $this->logs[] = date('Y-m-d H:i:s') . ': ' . $message;
    }
    
    public function getLogs(): array {
        return $this->logs;
    }
}

Ключевые различия

1. Реализация методов

  • Абстрактный класс может содержать:
    • Абстрактные методы (без реализации)
    • Обычные методы (с полной реализацией)
    • Свойства с модификаторами доступа
    • Константы
  • Интерфейс содержит только:
    • Сигнатуры методов (все публичные и абстрактные)
    • Константы (начиная с PHP 8.0, только публичные)

2. Наследование vs Реализация

  • Класс extends (наследует) абстрактный класс
  • Класс implements (реализует) интерфейс
  • В PHP класс может наследовать только один абстрактный класс, но реализовывать много интерфейсов

3. Конструкторы

  • Абстрактный класс может иметь конструктор
  • Интерфейс не может содержать конструктор (до PHP 8.0), с PHP 8.0 может, но это редко используется

4. Модификаторы доступа

  • В абстрактном классе методы могут иметь разные модификаторы (public, protected, private)
  • В интерфейсе все методы по умолчанию публичные (хотя можно явно не указывать)

5. Свойства (поля класса)

  • Абстрактный класс может содержать свойства с любыми модификаторами доступа
  • Интерфейс не может содержать свойства (только константы)

Когда что использовать?

Используйте абстрактный класс, когда:

  • Несколько классов имеют общую логику, которую можно вынести в родительский класс
  • Нужно определить общее состояние (свойства) для группы классов
  • Требуется частичная реализация с возможностью переопределения
abstract class PaymentProcessor {
    protected float $amount;
    
    public function __construct(float $amount) {
        $this->amount = $amount;
    }
    
    // Общая логика
    public function process(): bool {
        $this->validate();
        return $this->executePayment();
    }
    
    // Частичная реализация
    protected function validate(): bool {
        return $this->amount > 0;
    }
    
    // Абстрактный метод для реализации в потомках
    abstract protected function executePayment(): bool;
}

Используйте интерфейс, когда:

  • Нужно определить контракт для несвязанных классов
  • Требуется обеспечить полиморфное поведение
  • Класс должен реализовать несколько различных поведений
  • Важна гибкость и слабая связность
interface Serializable {
    public function serialize(): string;
    public function unserialize(string $data): void;
}

interface Cacheable {
    public function getCacheKey(): string;
    public function getCacheTTL(): int;
}

// Класс может реализовать несколько интерфейсов
class User implements Serializable, Cacheable {
    // Реализация методов обоих интерфейсов
}

Эволюция в современных версиях PHP

С версии PHP 8.0 интерфейсы получили дополнительные возможности:

  • Конструкторы в интерфейсах
  • Статические методы в интерфейсах
  • Наследование интерфейсов с сохранением сигнатур

Практический пример комбинации

interface Drawable {
    public function draw(): void;
}

abstract class Shape implements Drawable {
    protected string $color;
    
    public function __construct(string $color) {
        $this->color = $color;
    }
    
    // Общий метод для всех фигур
    public function setColor(string $color): void {
        $this->color = $color;
    }
    
    // Абстрактный метод для реализации
    abstract public function getArea(): float;
}

class Circle extends Shape {
    private float $radius;
    
    public function __construct(float $radius, string $color) {
        parent::__construct($color);
        $this->radius = $radius;
    }
    
    public function draw(): void {
        echo "Рисую круг радиуса {$this->radius} цветом {$this->color}";
    }
    
    public function getArea(): float {
        return pi() * pow($this->radius, 2);
    }
}

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

Что такое абстрактный класс и чем он отличается от интерфейса в PHP? | PrepBro