Ответ
Да, начиная с PHP 8.1, интерфейсы могут содержать статические методы. Это позволяет определить общий статический контракт для всех реализующих классов.
Пример:
interface Logger {
public static function create(string $name): self;
public function log(string $message): void;
}
class FileLogger implements Logger {
private string $name;
private function __construct(string $name) {
$this->name = $name;
}
public static function create(string $name): self {
return new self($name);
}
public function log(string $message): void {
file_put_contents($this->name . '.log', $message . PHP_EOL, FILE_APPEND);
}
}
// Использование
$logger = FileLogger::create('app');
$logger->log('Запуск системы');
Ключевые моменты:
- Статические методы в интерфейсах должны быть объявлены как
public. - Они не могут быть абстрактными (должны иметь тело, даже если это просто
{}в интерфейсе). - Класс, реализующий интерфейс, должен предоставить метод с точно такой же сигнатурой.
- До PHP 8.1 объявление статического метода в интерфейсе вызывало фатальную ошибку.