Можно ли определять константы в абстрактном классе?

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

Ответ

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

Пример с разными уровнями доступа:

abstract class Animal {
    // Публичная константа, доступна отовсюду
    public const KINGDOM = 'Animalia';
    // Защищенная константа, доступна внутри класса и наследников
    protected const DEFAULT_SOUND = '...';
    // Приватная константа, доступна только внутри Animal
    private const SECRET_CODE = 123;

    abstract public function makeSound(): void;

    public function getSecret(): int {
        return self::SECRET_CODE; // Доступ внутри класса
    }
}

class Dog extends Animal {
    public function makeSound(): void {
        // Доступ к защищенной константе предка
        echo self::DEFAULT_SOUND;
        // echo self::SECRET_CODE; // Fatal error: приватная константа недоступна
    }
}

// Использование
echo Animal::KINGDOM; // 'Animalia'
echo Dog::KINGDOM;    // 'Animalia' (публичная константа наследуется)

$dog = new Dog();
echo $dog->getSecret(); // 123 (доступ через публичный метод предка)

Важно: константы класса (включая абстрактные) нельзя переопределять в дочерних классах.