Когда выбирать абстрактный класс vs интерфейс
- Абстрактный класс — когда подклассы имеют общий код (shared logic) и между ними отношение «является разновидностью» (is-a). Нельзя реализовать несколько
- Интерфейс — когда нужен контракт без реализации; класс может реализовывать несколько интерфейсов
Пример
abstract class Shape {
abstract public function area(): float;
public function describe(): string {
return "Area: " . $this->area(); // общий код
}
}
class Circle extends Shape {
public function area(): float { return M_PI * $this->r ** 2; }
}