Можно ли добавить статический метод в интерфейс?

«Можно ли добавить статический метод в интерфейс?» — вопрос из категории ООП, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, начиная с 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('Запуск системы');

Ключевые моменты:

  1. Статические методы в интерфейсах должны быть объявлены как public.
  2. Они не могут быть абстрактными (должны иметь тело, даже если это просто {} в интерфейсе).
  3. Класс, реализующий интерфейс, должен предоставить метод с точно такой же сигнатурой.
  4. До PHP 8.1 объявление статического метода в интерфейсе вызывало фатальную ошибку.