🧱 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 in initializers
Создание объектов/массивов в значениях по умолчанию:
function process(
DateTime $dt = new DateTime(),
Logger $log = new FileLogger('/tmp/app.log')
) { ... }
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()).