TGViewer
Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter @phpproglib · 10.5K subscribers
Post #6345 2.09K
⏳ Как устроена типизация в PHP 8.x?

PHP долго был языком с динамической типизацией и репутацией «всё приведётся само». Начиная с PHP 7, а особенно с версий 8.0–8.3, система типов стала по-настоящему выразительной.

🔍 Что появилось и зачем

🔹 Union Types (8.0)

Тип может быть одним из нескольких:
function process(int|string $id): User|null {
// ...
}

Раньше это документировали только в PHPDoc и надеялись на лучшее.

🔹 mixed, never, void

▪️ mixed — явно говорит "любой тип", в отличие от отсутствия типа
▪️ never — функция никогда не вернёт управление (бросает исключение или завершает процесс)
▪️ void — функция ничего не возвращает

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


🔹 Intersection Types (8.1)

Значение должно реализовывать все указанные интерфейсы одновременно:
function process(Serializable&Countable $data): void {
// ...
}

Полезно при работе с коллекциями и DTO, которые соответствуют нескольким контрактам.

🔹 Enums (8.1)


Наконец-то нативные перечисления вместо констант в классах:
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
}

function setStatus(Status $status): void { ... }

Теперь нельзя передать произвольную строку туда, где ожидается Status.

🔹 Readonly properties (8.1) и readonly классы (8.2)

class User {
public function __construct(
public readonly int $id,
public readonly string $name,
) {}
}

В 8.2 можно пометить весь класс как readonly — все свойства автоматически становятся иммутабельными. Отлично подходит для Value Objects и DTO.

🔹 DNF Types — Disjunctive Normal Form (8.2)

Комбинация union и intersection:
function handle(Countable&Iterator|null $collection): void {
// ...
}

Тип читается как: "реализует оба интерфейса, либо null".

🔹 typed class constants (8.3)

class Config {
const string VERSION = '1.0.0';
const int MAX_RETRIES = 3;
}

До 8.3 константы классов не имели типов — теперь контракт полный.

⚠️ Нюансы

— declare(strict_types=1) обязателен, иначе PHP будет тихо приводить типы и "5" пройдёт там, где ожидается int
— Intersection types не работают с примитивами только с интерфейсами и классами
— readonly нельзя применить к static свойствам
— Enums не поддерживают наследование

Библиотека пхпшника
  • 👍 11
  • ❤ 4
  • 🔥 2
  • 🥱 1
More from @phpproglib
  1. Sep 23, 2026🛠 Symfony 8.2 научился автоматически генерировать JSON Schema для конфигурации приложения…
  2. Sep 23, 2026🚀 Свежий релиз Laravel 13 с набором улучшений и исправлений ✅ добавлена поддержка valkey:…
  3. Sep 21, 2026⚡️ PHP 8.6 выйдет 19 ноября 2026 года. Сейчас версия находится в beta. Самые заметные изме…
  4. Sep 20, 2026❓ Какие существуют проблемы в многопоточной среде? Основные проблемы многопоточности: 1️⃣…
  5. Sep 19, 2026🌞 В Symfony 8.2 появилось 29 новых Bundle — теперь компоненты вроде Mailer, Messenger и C…
  6. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →