В чем отличие абстрактного класса от интерфейса?php-97

Основные различия

Характеристика Абстрактный класс Интерфейс
Экземпляры Нельзя создать напрямую Нельзя создать вообще
Методы Может содержать реализацию Только сигнатуры (до PHP 8.0)
Свойства Может содержать свойства Только константы (до PHP 8.2)
Модификаторы Любые (public, protected, private) Только public
Наследование Один класс Множественное
Конструктор Может иметь Не может (до PHP 8.1)

Примеры кода

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

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 "Woof!";
    }
}

Интерфейс

interface Loggable {
    public function log(string $message): void;
}

class FileLogger implements Loggable {
    public function log(string $message): void {
        file_put_contents('log.txt', $message);
    }
}

Новое в современных версиях PHP

Интерфейсы с PHP 8.0+

  1. Методы с реализацией (default methods)
interface Logger {
    public function log(string $message): void;

    public function logError(string $error): void {
        $this->log("[ERROR] " . $error);
    }
}
  1. Константы с видимостью (PHP 8.1+)
interface Cache {
    public const DEFAULT_TTL = 3600;
    private const MAX_TTL = 86400;
}

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

Абстрактный класс когда:

  • Есть общая логика для наследников
  • Нужны protected методы/свойства
  • Требуется конструктор с параметрами

Интерфейс когда:

  • Нужно описать контракт без реализации
  • Требуется множественное "наследование"
  • Важна полиморфная природа объектов

Резюмируем:

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