30.11.20213 min

Justyna SzatanRedakcja Bulldogjob

Co nowego w PHP 8.1?

Sprawdź, jakie nowe funkcje wprowadziła listopadowa aktualizacja PHP 8.1 i jak to wpłynie na Twój kod.

Co nowego w PHP 8.1?

W zeszłym tygodniu pojawiła się nowa aktualizacja PHP — wersja 8.1, która będzie utrzymywana do 2024 r. Miło się zaskoczyłam, ponieważ poza klasycznym naprawieniem błędów i poprawieniem stabilności kodu pojawiły się całkiem nowe i przydatne feautere’y.

Przykładem niech będzie m.in.  długo wyczekiwany enum czy typ bezzwrotny, o czym napiszemy więcej później. Dzięki wprowadzonym funkcjom Twoja strona www zyska na operatywności. Przejdźmy wspólnie przez najciekawsze zmiany:


Enums

 

Wreszcie pojawił się długo wyczekiwany typ enum, umożliwiający zdefiniowanie użytkownikom typów danych z określonymi wartościami. Przykład poniżej:

enum Status
{
    case Draft;
    case Published;
    case Archived;
}
function acceptStatus(Status $status) {...}


Fibers

to blok kodu z określonym stanem i zmiennymi, które mogą być wykonywane równolegle i asynchronicznie względem kodu. W skrócie utrzymują swoje własne stosy, dlatego mogą być uruchamiane i wznawiane w dowolnym miejscu.

Nie pozwoli to na jednoczesne działanie głównego kodu i mniejszych bloków, natomiast umożliwi efektywnie zarządzać procesami przy zachowaniu pętli zdarzeń na tym samym API.

$response = $httpClient->request('https://example.com/');
print json_decode($response->getBody()->buffer())['code'];


Modyfikator readonly

Modyfikator readonly jest dostępny wyłącznie dla właściwości klas, zatem jeśli po inicjalizacji spróbujemy zmienić wartość takiej właściwości, to wywoła to błąd.

class BlogData
{
    public readonly Status $status;
  
    public function __construct(Status $status)
    {
        $this->status = $status;
    }
}


Typ bezzwrotny

Typ never to nowy typ zwracany, który zmienia zachowanie funkcji lub metody. Zgodnie z założeniem program nie zwróci wartości, tylko zgłosi wyjątek lub zakończy działanie kodu z wezwaniem die(), exit(), trigger_error(). Poniżej przykład:  

function redirect(string $uri): never {
    header('Location: ' . $uri);
    exit();
}

function redirectToLoginPage(): never {
    redirect('/login');
    echo 'Hello'; // <- dead code detected by static analysis
}


Nowa funkcja array_is_list

Funkcja array_is_list sprawdza, czy dane tablice są listami. Jeśli ma uporządkowane wartości, a wszystkie klucze są liczbami całkowitymi od 0 wzwyż, wówczas zwróci wartość true (dotyczy to też pustych tablic). Poniżej przykład:

<?php

array_is_list([]); // true
array_is_list(['apple', 2, 3]); // true
array_is_list([0 => 'apple', 'orange']); // true

// The array does not start at 0
array_is_list([1 => 'apple', 'orange']); // false

// The keys are not in the correct order
array_is_list([1 => 'apple', 0 => 'orange']); // false

// Non-integer keys
array_is_list([0 => 'apple', 'foo' => 'bar']); // false

// Non-consecutive keys
array_is_list([0 => 'apple', 2 => 'bar']); // false
?>


Intersection Types

to przeciwieństwo union types, dlatego zadeklarowany typ dla konkretnego parametru wymusi przynależność wartości do wszystkich określonych typów klas czy interfejsów. Typy skrzyżne tworzy się poprzez wpisanie & jako łącznika nazw klas i interfejsów.

W PHP mamy do czynienia z czystymi, zatem nie można zastosować połączenia np. A&B|C

function count_and_iterate(Iterator&Countable $value) {
    foreach ($value as $val) {
        echo $val;
    }

    count($value);
}


Nowe Funkcje:

  • poprzedzono prefixem 0o liczby ósemkowe,
  • stałe w klasach można zadeklarować jako final, co uniemożliwi ich nadpisywanie w klasach dziedziczonych,
  • rozpakowywanie tablic jest teraz możliwe również w przypadku, gdy klucze są ciągami znaków,
  • sodium XChaCha20 pozwoli zaszyfrować kod i pracować na nim również bez uwierzytelnienia.


Podsumowanie

W aktulizacji PHP 8.1 udało się w przyspieszyć aplikację Symfony Demo o 23% i WordPressa o 3,5%. Natomiast benchmark preprowadzony na serwerze AMD EPYC 7543 wykazał, że jest szybsza od poprzedniej (PHP 8.0) o 3% (dla porównania do wersji 7.1 to przyspieszenie o 33%). Przeciętny użytkownik może nie zauważy tej subtelnej zmiany w ładowaniu strony e-sklepu, ale lepsze to niż nic :). Wprowadzone nowości wydają się atrakcyjne, ponieważ pozwolą objętościowo skompresować nieznacznie nasz kod i pisać go bardziej spójnie. Daj znać, na jakie usprawnienie jeszcze czekasz lub co w tych nowych funkcjach według Ciebie się nie sprawdzi.

<p>Loading...</p>