PHP 8.1 (25.11.2021)

Enum

🧱 Enumerations (enum)
Типобезопасные перечисления:

				
					enum Status: string {
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
}

function setStatus(Status $status): void { ... }
setStatus(Status::DRAFT); // ✅
				
			

→ Поддерживают методы, интерфейсы, BackedEnum (->value).
→ Нельзя наследовать.

Свойство только для чтения (только динамические свойства, указание типа обязательно)

📦 Readonly properties
Свойства только для чтения:

→ Инициализируются только в __construct или при объявлении.
→ Не работает для static-свойств.

				
					class User {
    public function __construct(
        public readonly int $id,
        public readonly string $name
    ) {}
}
$user = new User(1, 'Иван');
$user->id = 2; // ❌ Fatal error
				
			

Оператор new в инициализации

🔍 new in initializers
Создание объектов/массивов в значениях по умолчанию:

				
					function process(
    DateTime $dt = new DateTime(),
    Logger $log = new FileLogger('/tmp/app.log')
) { ... }
				
			

Тип never(ф-ция ничего не возвращает и выбрасывает исключение)

🧪 never return type

Функция никогда не возвращает управление:

→ Помогает статическим анализаторам (PHPStan, Psalm).

				
					function redirect(string $url): never {
    header("Location: $url");
    exit;
}
				
			

Пересечение типов

🧩 Intersection types
Несколько интерфейсов одновременно:

→ Только для object-типов (не скаляры).
→ Используется редко — чаще в фреймворках.

				
					function save(HasId&HasTimestamp $entity): void { ... }
				
			

Прочее

mysql и mcrypt — полностью удалены (если вдруг остались),
Serializable интерфейс — deprecated (заменён на __serialize()/__unserialize()),
strftime() — deprecated (используй IntlDateFormatter или DateTime::format()).