Возможно вы не знали, но в PHP константные выражения могут использоваться в качестве констант, т.к. являются операцией времени компиляции.
Я догадывался об этом, однако в голове всегда были исключительно всякие бинарные операторы, типа public const int MASK = self::BASE | 0b0001
А тут взглянул с другой стороны, по-приколу написал и узнал, что, оказывается, тернарники тоже являются выражением и тоже могут сворачиваться в compile-time, например:
define('IS_LITTLE_ENDIAN', \pack('S', 1) === "\x01\x00");
enum Endianness
{
case Little;
case Big;
public const self HOST = IS_LITTLE_ENDIAN
? self::Little
: self::Big;
}
При этом, match, например уже в такое не умеет
enum Endianness
{
case Little;
case Big;
// Ошибка: Constant expression contains invalid operations
public const self HOST = match(IS_LITTLE_ENDIAN) {
true => self::Little,
default => self::Big,
};
}
Ну т.е. с match ещё вроде более-менее понятно, но вот про тернарники я не знал.
Причём поддержка тернарников в константах появилась в PHP 8.3 вместе с типизацией
https://onlinephp.io/c/2ca66
Но в релиз нотисах и на лендинге (
https://www.php.net/releases/8.3/ru.php) я этой фичи найти не смог. Её просто нигде нет! Но работает)