Можно ли объявлять константы в интерфейсе?

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

Ответ

Да, начиная с PHP 8.1, в интерфейсах можно объявлять константы. Они являются публичными, неизменяемыми и доступны через имя интерфейса или класс, реализующий этот интерфейс.

Пример объявления и использования:

interface Logger {
    public const LOG_LEVEL_ERROR = 1;
    public const LOG_LEVEL_WARNING = 2;

    public function log(string $message, int $level): void;
}

class FileLogger implements Logger {
    public function log(string $message, int $level): void {
        if ($level === Logger::LOG_LEVEL_ERROR) {
            // Обработка ошибки
        }
    }
}

// Доступ через интерфейс
echo Logger::LOG_LEVEL_ERROR; // 1
// Доступ через реализующий класс
echo FileLogger::LOG_LEVEL_WARNING; // 2

Ключевые особенности:

  • Константы в интерфейсах всегда public (модификатор можно не указывать).
  • Нельзя объявлять protected или private константы.
  • Константы наследуются всеми классами, реализующими интерфейс.
  • Хотя технически константу можно переопределить в классе с помощью const, это считается плохой практикой, нарушающей контракт интерфейса.