• PHP 8.0 — kluczowe zmiany
    • Union types (np. int|float)
    • Match expression (zwraca wartość, brak break)
    • Named arguments (np. fn(name: 'Jan'))
    • Nullsafe operator ?-> (bezpieczny dostęp do właściwości/metod)
    • Constructor property promotion (skrótowy zapis właściwości w konstruktorze)
    • JIT (Just-In-Time) — potencjalne przyspieszenie w obliczeniach)
  • PHP 8.1 — ważne dodatki
    • Enumy (natywne enumeracje oraz backed enums z wartością)
    • Readonly properties (właściwości tylko do odczytu po przypisaniu)
    • First-class callables (np. strlen(...))
    • Fibers (lekka współbieżność)
    • Intersection types (np. A&B)
  • PHP 8.2 — porządki i nowe możliwości
    • Readonly classes (wszystkie właściwości klasy readonly)
    • DNF types / złożone kombinacje typów (np. (A&B)|null)
    • Deprecation dynamicznych właściwości (wymagaj deklaracji lub #[AllowDynamicProperties])
    • Nowe helpery: json_validate(), mb_str_pad()
  • PHP 8.3 — udoskonalenia
    • Typed class constants (stałe klas z typami)
    • Poprawki JIT i reflection (lepsze wsparcie dla enumów i atrybutów)
    • Deep clone dla readonly/clone oraz drobne ulepszenia match
  • Przydatne funkcje i helpery
    • str_contains(), str_starts_with(), str_ends_with()
    • array_is_list(), array_key_first(), array_key_last()
    • get_debug_type() — lepsze niż gettype()
  • Zmiany w zachowaniu
    • Bardziej rygorystyczne porównania luźne (0 == 'foobar' zwraca false w PHP 8)
    • Więcej przypadków zgłaszających TypeError zamiast cichego rzutowania
    • Operator @ mniej zalecany — ukrywa błędy i spowalnia
  • Deprecations / do unikania
    • Dynamiczne właściwości bez deklaracji
    • Stare funkcje/aliasy (np. create_function(), each())
    • Funkcje związane z przestarzałym przetwarzaniem UTF-8 planowane do usunięcia
  • Praktyczne wskazówki migracyjne
    • Uruchom statyczną analizę (PHPStan/Psalm) po dodaniu typów
    • Wykonaj testy jednostkowe i integracyjne (sprawdź zachowanie porównań i typów)
    • Zamień stałe stringowe na enumy tam, gdzie reprezentujesz skończony zbiór wartości
    • Zastąp dynamiczne właściwości jawnie zadeklarowanymi lub dodaj #[AllowDynamicProperties] tymczasowo
    • Sprawdź i zaktualizuj biblioteki (Composer) — wiele rozszerzeń korzysta z nowych typów
  • Szybkie przykłady (do wklejenia)
    • Enum:
      • enum Status: string { case Draft = 'draft'; case Published = 'published'; }
    • Match:
      • $result = match($code) { 200 => 'OK', 404 => 'Not found', default => 'Unknown' };
    • Nullsafe:
      • $name = $user?->profile?->name;
  • Co warto używać
    • Types (return + params), enumy, readonly dla DTO/VO, named args dla czytelności
    • PHPStan/Psalm + CI, testy, i aktualny Composer
💼 Szukam pracy jako programista PHP LinkedIn