PHP 8.2 – co nowego tym razem

tabliczka z napisem zmiana

Data wypuszczenia PHP 8.2 przypada na 8 grudzień 2022 roku. Jest oczywiście kilka zmian, a ja jak zwykle postaram się Wam je przybliżyć w charakterystyczny dla mnie sposób. Krótko i konkretnie, ale też z moją opinią. Pisanie o samych funkcjonalnościach nic nie wniesie – tego możecie się dowiedzieć z oficjalnej strony PHP.

Jakie zmiany w PHP 8.2

Klasy tylko do odczytu

Niedawno pisałem o polach tylko do odczytu, które weszły w PHP 8.1. Teraz w kolejnej wersji języka można pójść o krok dalej i całą klasę oznaczyć jako readonly. Prezentuję obie wersje, które oznaczają w sumie to samo.

<?php
 
declare(strict_types=1);
 
namespace Koddlo\Application\Command\Client;
 
final class CreateClientCommand
{
    public function __construct(
        public readonly string $id,
        public readonly string $email,
        public readonly string $firstName,
        public readonly string $lastName
    ) {
    }
}
<?php
 
declare(strict_types=1);
 
namespace Koddlo\Application\Command\Client;
 
final readonly class CreateClientCommand
{
    public function __construct(
        public string $id,
        public string $email,
        public string $firstName,
        public string $lastName
    ) {
    }
}

Całkiem fajne usprawnienie, dlatego że rzadko pola tylko do odczytu chodziły w parze z tymi możliwymi do zmodyfikowania. Jest to oczywiście do zrobienia, ale raczej się tego nie miesza. Tak jak w komendach, DTO i innych tego typu prostych obiektach, decydując się na pola publiczne zamiast prywatnych z getterami, wszystkie będą readonly. Dobrze, że ktoś pomyślał. W sumie to od razu można było to wrzucić razem.

Zwróćcie uwagę na ograniczenia wynikające z pól tylko do odczytu, które teraz rzutują na całą klasę. W skrócie:

  • do każdego pola można przypisać wartość jednokrotnie,
  • musi być określony typ każdego pola,
  • nie można przypisać wartości domyślnej,
  • nie da się ustawić wartości pola bezpośrednio (tylko przez metody),
  • przy dziedziczeniu klasa rodzica i potomka muszą być oznaczone tak samo,
  • brak statycznych pól (ale tego mam nadzieję nikt nie używa).

Typy false, true i null

Aktualnie, owe typy dało się, tylko i wyłącznie, łączyć z innymi. Teraz będzie można ich używać samodzielnie. Pewnym zastosowaniem może być ograniczenie typu w klasie potomnej. Na przykład wzorzec Null Object zawsze zwróci null, więc można zawęzić tylko do tego typu. Analogicznie zaślepki w testach i inne tego rodzaju obiekty pomocnicze.

Raczej kosmetyka. Nie widzę wielu zastosowań. Z drugiej strony, nie ma też opcji nadużywania, czy błędnego użycia, więc lepiej mieć taką opcje, niż jej nie mieć. Daje to możliwość bycia bardziej precyzyjnym.

Typowanie DNF (Disjunctive Normal Form)

Typowanie w PHP 8.2 staje się coraz bardziej rozbudowane i elastyczne. Z jednej strony fajnie, chociaż boję się o nadużycia. Tak, czy inaczej od 8.1 są już typy intersection, które pozwalają na wymuszenie wielu typów. Do tej pory, nie dało się jednak zrobić ich jako nullable, co dzięki DNF będzie możliwe. Innych zastosowań nie dostrzegam, choć i to wydaje mi się naciągane, ale co ja tam wiem.

public function validate((UserRequestInterface&ApiRequestInterface)|null $request): void

Stałe w traitach

Traity to syf. Nie korzystam z nich nigdy. Koniec opisu.

Wycofanie dynamicznych pól

Pola deklarowane dynamicznie to już przeżytek. Mam nadzieję, że już nikt tak nie programuje. Oczywiście istnieje masa systemów legacy, które mogą mieć tego typu rozwiązania. W związku z tym, w tej wersji oznaczone zostaje to jako deprecated. Docelowo w wersji 9 ma zostać wywalone. Bardzo dobra zmiana. Najwyższy czas na pozbywanie się zaszłości, nawet jeżeli są to zmiany wstecznie niekompatybilnie.

Nowe rozszerzenie random

Nie jestem ekspertem w tym temacie, ale zagwarantowanie losowości nigdy nie jest proste. Wbudowane funkcje PHP, które do tego służą mają swoje problemy. Nowe rozwiązanie, czyli cała seria wbudowanych mechanizmów z przestrzeni nazw \Random , nie opiera się na globalnym stanie i co ważne, gwarantuje lepszą wydajność i lepsze bezpieczeństwo. Ogólnie, po szczegóły odsyłam do RFC.

Wiele innych usprawnień

Oczywiście powyżej opisane to te największe albo najbardziej grzejące zmiany. Jak zawsze, jest też sporo mniejszych usprawnień. Nie sposób je wymienić, ale pewnie będą one ważne w kontekście podnoszenia projektów do wyższej wersji. Pełna lista zmian w changelogu.

PHP 8.2 – podsumowanie

PHP powoli brnie do przodu. Widać, że wiele usprawnień jest przemyślanych, a społeczność jest mocno zaangażowana. Przyznam, że nie zawsze wszystkie zmiany w mojej ocenie są sensowne, ale kierunek jest jak najbardziej dobry.

Wersja 8.2 PHP to dopieszczenie wielu miejsc. Widać ogrom wykonanej pracy, chociaż na codzienny development nie będzie to miało wielkiego wpływu. Przejście z 8.1 na 8.2 będzie bezbolesne. To dobrze. Od tego w końcu są małe wersje, a rewolucji można się doszukiwać w wersji 9. Chociaż ja i tak uważam, że jest to na tyle dojrzały język, że nie będzie niesamowitych game changerów.

Programista PHP i właściciel marki Koddlo. Pasjonat czystego kodu i dobrych praktyk programowania obiektowego. Prywatnie fan dobrego humoru i podcastów.