Характеристика | Абстрактный класс | Интерфейс |
---|---|---|
Экземпляры | Нельзя создать напрямую | Нельзя создать вообще |
Методы | Может содержать реализацию | Только сигнатуры (до 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 границы между ними размываются, но концептуальные различия остаются.