Nasza strona używa cookies. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Jeszcze więcej nowości w PHP 8.0

PHP 8.0 już jest. Sprawdź, co twórcy przygotowali dla użytkowników tym razem.
Jeszcze więcej nowości w PHP 8.0

Data wypuszczenia PHP 8.0, najnowszej wersji tego języka, przypada na 26 listopada 2020. Wydanie pojawiło się już na oficjalnej stronie. 8.0 to oczywiście wydanie major, co oznacza, że dostaniemy sporo nowości i ulepszoną wydajność, ale również rzeczy, które mogą popsuć istniejący kod. Trzeba będzie pewnie z tego powodu trochę pogrzebać w już istniejących aplikacjach, aby w najnowszej wersji wszystko dobrze działało. 

Niemniej jednak PHP 8.0 przynosi ze sobą takie nowości, jak kompilator JIT, typy unii, czy zmianę w korzystaniu z atrybutów, o których pisaliśmy już tutaj. Dzisiaj jednak skupimy się na obszerniejszym opisie „ósemki”.

Zaczynajmy!


Union Types

PHP 8.0 daje nam obsługę tzw. union types. Mogą się one tam przydać, zwłaszcza ze względu na dynamicznie typowaną naturę tego języka. Dotychczas nie można było korzystać w PHP z unii, ponieważ nie pozwalała nam na to składnia. Tę przeszkodę dało się jednak obejść, definiując typy w adnotacjach. 

Od teraz możemy zadeklarować więcej, niż 1 typ na argument, typ zwracany, czy właściwość klasy.

class Example {
    private int|float $foo;
    public function squareAndAdd(float|int $bar): int|float {
        return $bar ** 2 + $foo;
    }
}


PHP zapewni też, że argument, typ zwracany, czy właściwość klasy, będą należały do jednego z typów podanych w definicji. 


Kompilator JIT (albo Just in Time)

To prawdopodobnie najbardziej wyczekiwana nowość w PHP. Mechanizm ten można już było testować w wersji 7.4, ale teraz oficjalnie ukaże się on w całości. Ale przejdźmy do sedna: czym jest JIT?

A zatem nowość ta pozwala na kompilację do kodu maszynowego tuż przed jego wykonaniem. To znacznie przyspiesza wykonanie kodu, względem kodu bajtowego generowanego standardowo przez interpreter. JIT znakomicie sprawdza się w typowo matematycznych zadaniach, oferuje tu przyspieszenie wykonania nawet o kilkaset procent. W przypadku aplikacji webowych na razie nie ma niestety mowy o tak spektakularnych wynikach.


Atrybuty

Znane również jako adnotacje, wcześniej były tworzone jedynie jako komentarze do kodu. PHP 8.0 sprawi, że będą one jego częścią. 

Zamiast takiej adnotacji:

/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /* ... */ }


Można napisać:

#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }


Match expression

Niektórzy mogą widzieć tutaj podobieństwo z wyrażeniem switch. A to dlatego, że wyrażenie match może zwracać wartości, nie wymaga instrukcji break, może łączyć ze sobą warunki, korzysta z silnego typowania i nie wykonuje koercji typów. Co więcej, jeżeli żaden z przypadków w porównaniu typów nie zostaje spełniony, to domyślnie zostanie wyrzucony wyjątek UnhandeledMatchError

Wyrażenie match wygląda w taki sposób:

$result = match($input) {
    0 => "hello",
    '1', '2', '3' => "world",
};


Constructor property promotion

Wraz z PHP 8.0 znika potrzeba przypisywania wielu argumentów w konstruktorze do właściwości obiektu - PHP połączy je teraz w jedno. A to dlatego, że twórcy dodali tutaj po prostu trochę lukru składniowego.

A więc zamiast czegoś takiego:

class Money 
{
    public Currency $currency;
 
    public int $amount;
 
    public function __construct(
        Currency $currency,
        int $amount,
    ) {
        $this->currency = $currency;
        $this->amount = $amount;
    }
}


Mamy coś takiego:

class Money 
{
    public function __construct(
        public Currency $currency,
        public int $amount,
    ) {}
}


Pozostałe nowości

Jedną z innych nowości jest nullsafe operator, który pozwala na szybkie pobranie właściwości lub wywołanie metody, jeżeli nie robimy tego na nullu. Nowy operator w akcji wygląda następująco: $item->getField()?->getValue(). Dalej mamy static, które zostało dodane jako typ zwracanej wartości, podczas gdy wcześniej mieliśmy tylko self oraz nowy typ wartości - mixed.

Jest tutaj jeszcze nowy interfejs Stringable, który jest automatycznie przypisany do klas implementujących metodę __toString() oraz WeakMaps - mechanizm do przechowywania referencji, który pozwala też na ich usuwanie przez garbage collector.


Podsumowanie

Oto najważniejsze zmiany w nowym PHP 8.0. Nie ma tu wielkiej rewolucji, widać raczej dalszą modernizację języka i porządkowanie oraz uspójnianie składni PHP. Co więcej, nowe wydanie wprowadza również wiele długo wyczekiwanych nowości, takich jak np. opisywany kompilator JIT. 


Masz jakieś przemyślenia na temat nowej wersji PHP? Podzieli się nimi w komentarzu 👇

2 komentarzy

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 160 tysiącami naszych czytelników

Dowiedz się więcej