Ответ
Да, абстрактные классы могут содержать константы, как и обычные классы. Они полезны для определения общих для всех наследников неизменяемых значений.
Пример с разными уровнями доступа:
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 (доступ через публичный метод предка)
Важно: константы класса (включая абстрактные) нельзя переопределять в дочерних классах.