Blog

8 najważniejszych funkcji w PHP 8.0

W lutym 2021 rozpoczęliśmy wprowadzanie php 8 na serwerach z serii Hosting Dedykowany oraz Hosting dla Agencji. Na nowo zamówionych serwerach php 8 jest zainstalowane domyślnie. W przypadku serwerów zamówionych przed lutym 2021 aby uruchomić wersję php 8 prosimy skontaktować się z naszą pomocą techniczną. Po sprawdzeniu możliwości technicznych wersja php 8 zostanie zainstalowana.

Nowa wersja PHP 8 pojawiła się pod koniec listopada 2020 roku. Najnowsza wersja PHP zawiera zarówno dodatkowe funkcje jak również ulepszenie wydajności.

W tym artykule przyjrzymy się ośmiu największym usprawnieniom oferowanym przez PHP 8. Pełną listę dodatków i zmian można znaleźć w oficjalnej dokumentacji. W dokumentach znajduje się również obszerny przewodnik migracji, który można wykorzystać podczas aktualizacji projektów z PHP 7.4.

  1. Atrybuty

Atrybuty, znane również jako adnotacje, zapewniają mechanizm dodawania metadanych do kodu. Atrybuty mogą być używane z klasami, metodami, funkcjami i właściwościami. Są łatwiejsze w obsłudze niż adnotacje docblock używane w wielu projektach PHP 7.

Atrybuty są zdefiniowane jako proste klasy, które są opisane za pomocą wbudowanego atrybutu Attribute:

#[Attribute]
class ExampleAttribute {
 
    protected string $value;
 
    public function __construct(string $value) {
        $this ->; value = $value;
    }
 
    public function getValue() : string {
        return $this ->; value;
    }
 
}

Można je następnie dołączyć do kodu:

#[ExampleAttribute("Example")]
class ExampleClass {
    // ...
}

Atrybuty są pobierane za pośrednictwem Reflection API. Umożliwia on sprawdzanie i konstruowanie atrybutów zdefiniowanych w klasie, metodzie lub innym elemencie kodu. Atrybuty będą najbardziej użyteczne we frameworkach i bibliotekach.

2. Argumenty nazwane (Named Arguments)

Argumenty nazwane umożliwiają przekazywanie parametrów do metod i funkcji przy użyciu konstrukcji w postaci tablicy. Ułatwia to pomijanie opcjonalnych parametrów i przekazywanie ich poza kolejnością.

function foo(?string $a=null, ?string $b=null, ?string $c=null) : void;

W PHP 7, wywoływanie powyższej funkcji podczas przekazywania wartości “demo” do $c wymagało następującego wywołania:

foo(null, null, "demo");

W PHP 8 można zamiast tego użyć następującej składni:

foo(c: "demo");

Dzięki temu wywołania funkcji z wieloma opcjonalnymi argumentami są mniej powtarzalne i łatwiejsze w utrzymaniu.

3. Constructor Property Promotion

Wypełnianie właściwości klasy wartościami początkowymi jest jedną z najczęstszych ról konstruktora. Kod podobny do poniższego jest często spotykany w bazach kodu PHP 7:

class Example {
 
    protected ?string $Property;
 
    public function __construct(?string $Property=null) {
        $this ->; Property = $Property;
    }
 
}

PHP 8 dodaje obsługę Constructor Property Promotion, skróconej składni, która pozwala łączyć definicję właściwości, podpowiedzi typu i wypełnianie w sygnaturze konstruktora. Powyższy przykład można przepisać w następujący sposób:

class Example {
    public function __construct(
        protected string $Property=null
    )
}

Ten styl eliminuje powtórzenia. Jego użycie ułatwia dodanie dodatkowych właściwości konstruktora w przyszłości, zmniejszając liczbę sekcji kodu, które musiałbyś zmodyfikować.

4. Union Types

System typów PHP stale się rozwija wraz z PHP 8. Obecnie można wskazać typy jako „unię” dwóch lub więcej typów, gdzie wartość typu może pochodzić z dowolnego typu w unii.

public function foo(string|int $bar) : int|float;

W powyższym przykładzie, funkcja foo() akceptuje zarówno ciągi znaków jak i liczby całkowite. Zwróci ona albo liczbę całkowitą albo liczbę zmiennoprzecinkową (float).

W praktyce, ta możliwość będzie prawdopodobnie najbardziej przydatna, gdy zastosujemy ją do właściwości i parametrów metod – jest to dobra forma akceptowania różnych typów wejściowych i normalizowania ich do pojedynczego typu wyjściowego.

5. Match Expression

Nowe wyrażenie jest bezpieczniejszą alternatywą dla dobrze znanej konstrukcji switch. Nie wymaga stosowania instrukcji case i break, obsługuje połączone warunki i zwraca wartość zamiast wprowadzania nowego bloku kodu. Koercja typu jest wyłączona, więc 1.0 (liczba zmiennoprzecinkowa) nie jest uważana za równoważną z „1.0” (ciąg znaków), w przeciwieństwie do użycia konstrukcji switch.

Oto typowy przykład zastosowania switch PHP 7:

switch (1.0) {
    case 1.0:
        $result = "Float!";
        break;
    case "foo":
    case "bar":
        $result = "foobar!";
        break;
}

A oto jak ten sam kod mógłby wyglądać w PHP 8:

$result = match (1.0) {
    1.0 =>; "Float!",
    "foo", "bar" =>; "foobar!"
}

Po raz kolejny nowe podejście jest znacznie bardziej zwięzłe. Jedynym zastrzeżeniem, na które należy zwrócić uwagę, jest to, że wartości składni połączonych warunków nie są zdefiniowane w tablicy, ale jako prosty zestaw rozdzielany przecinkami, podobny do wywołania funkcji.

6. Operator „Nullsafe”

Kolejna koncepcja zapożyczona z innych języków, PHP 8 obsługuje sprawdzanie null inline z automatycznym rozwiązaniem typu short-circuit. Istnieje możliwość zbudowania łańcucha weryfikacji, który przerwie działanie, zwracając null, gdy ocena któregoś z elementów zakończy się niepowodzeniem.

W PHP 7:

$photo = null;
if ($user !== null) {
    if ($user ->; profile !== null) {
        if ($user ->; profile ->; getPhoto() !== null) {
            $photo = $user ->; profile ->; getPhoto() ->; getPath();
        }
    }
}

Oraz w PHP 8:

$photo = $user? ->; profile? ->; getPhoto()? ->; getPath();

PHP 8 ponownie dostarcza prostsze rozwiązanie, które eliminuje zagnieżdżania. Skutkuje to znacznie mniejszą ilością kodu do przetestowania i utrzymania.

7. Stricter Type System

Przyjrzeliśmy się już jak Union types dodają kolejną warstwę elastyczności do systemu typów w PHP 8. Kilka dodatkowych zmian w tym obszarze zwiększa rygorystyczność i spójność, z jaką sprawdzanie typów jest egzekwowane.

Porównywanie ciągów znaków do liczb jest teraz bardziej bezpieczne. 0 (liczba całkowita) nie jest już równoważne „” (pusty łańcuch), a porównania takie jak 123 == "123abc" dają teraz wartość false, a nie true. Zmiany te pomagają zmniejszyć prawdopodobieństwo wystąpienia błędów porównawczych w kodzie.

8. JIT (kompilator Just In Time)

PHP 8 dodaje wsparcie dla kompilacji Just-In-Time, która może znacznie zwiększyć wydajność.

Długo działające skrypty obsługujące powtarzalne zadania skorzystają na kompilacji JIT. Testy wskazują, że poprawa będzie mniej widoczna w aplikacjach internetowych, gdzie PHP jest najczęściej spotykane. Dodanie JIT może jednak pomóc w rozszerzeniu PHP na inne dziedziny programowania, zwiększając atrakcyjność i wszechstronność języka.

JIT należy włączyć przy użyciu nowych ustawień w pliku konfiguracyjnym php.ini. Szczegółowe informacje na temat dostępnych wartości i ich wpływu można znaleźć w dokumentacji. Jednak jako ogólne domyślne ustawienie zaleca się:

<code>opcache.enable=1
opcache.jit_buffer_size=100M
opcache.jit=1255</code>

Podsumowanie

Przedstawiliśmy tylko osiem najbardziej znaczących dodatków i zmian w PHP 8. Przed rozpoczęciem używania PHP 8 w swoich projektach warto przejrzeć oficjalne informacje o wydaniu, ponieważ istnieje wiele innych pomniejszych funkcji, których nie mogliśmy tutaj opisać .

Chociaż większość zmian jest kompatybilna wstecz, potencjalnymi problemami mogą być usprawnienia w systemie typów oraz zmiany w bibliotece standardowej. Pełną instrukcję migracji można znaleźć na stronie z dokumentacją PHP.