An enum cannot be extended, so every constant on it is final by construction and the keyword is redundant rather than forbidden.
enum OrderStatus: string
{
case Pending = 'pending';
case Shipped = 'shipped';
const DEFAULT = self::Pending; // a case as a constant
const OPEN = [self::Pending]; // and an array of them
}
OrderStatus::DEFAULT; // OrderStatus::Pending
// interface constants became overridable in 8.1, which is
// the change that made `final const` necessary elsewhere.
A constant whose value is a case is the idiomatic way to express a default, and it composes with the enum rather than sitting in a separate class. The contrast with interface constants is worth holding in mind: those became overridable in 8.1, so an interface constant is now a suggestion where an enum constant is a fact.