| Характеристика | Абстрактный класс | Интерфейс |
|---|---|---|
| Экземпляры | Нельзя создать напрямую | Нельзя создать вообще |
| Методы | Может содержать реализацию | Только сигнатуры (до 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);
}
}
interface Logger {
public function log(string $message): void;
public function logError(string $error): void {
$this->log("[ERROR] " . $error);
}
}
interface Cache {
public const DEFAULT_TTL = 3600;
private const MAX_TTL = 86400;
}
Абстрактный класс когда:
Интерфейс когда:
Абстрактные классы предоставляют частичную реализацию и используются для отношения "является", тогда как интерфейсы определяют контракт для отношения "может делать". В современных версиях PHP границы между ними размываются, но концептуальные различия остаются.