Co nowego w PHP 8?

23 sierpnia 2020

Grudzień 2020 to właśnie wtedy zostanie wypuszczony w świat PHP 8. Jeśli zastanawiasz się co nowego wymyślili Twórcy tego języka, to ten wpis jest dla Ciebie. Wybrałem osiem moim zdaniem najciekawych feature’ów jakie otrzymamy wraz z nową wersją.

1. Just in Time

JIT (Just in Time) oznacza tyle, że kod Twojej aplikacji będzie kompilowany dopiero w momencie, gdy zajdzie taka potrzeba. Załóżmy, że tworzysz funkcję, która podczas uruchomienia aplikacji nie zostanie wywołana. Wówczas nie zostanie ona skompilowana.

Dzięki temu zaoszczędzimy cenne zasoby serwera oraz czas potrzebny na kompilację. Co ciekawe wykorzystanie JIT ma być możliwe zarówno dla nowych jak i starych skryptów. Czy to oznacza, że czeka nas przyspieszenie na przykład stron opartych o WordPress? Wiele na to wskazuje, ale zobaczymy jak będzie.

2. Union types

We wszystkich miejscach, gdzie możemy definiować typy wartości, będziemy mogli używać union types. W praktyce oznacza to, że zmienna będzie mogła być typu int lub float. Oczywiście wszystko zależy od tego czego potrzebujemy w danym momencie. Zasada jest prosta, stosujemy zapis T1 | T2 w miejscu definiowania typu. W kodzie możemy zapisać to tak:

class Number {
    private int|float $number;
 
    public function setNumber(int|float $number): void {
        $this->number = $number;
    }
 
    public function getNumber(): int|float {
        return $this->number;
    }
}

Mimo deklaracji wsparcia dla wszystkich dostępnych dziś typów mamy parę zastrzeżeń.

  1. Typ void nie może być uwzględniony w union types. Czyli zapis np. int|void spowoduje błąd.
  2. Jeśli zmienna ma być nullable możesz to zapisać jako np. int|null
  3. Zduplikowane lub nadmiarowe typy będą powodowały błędy kompilacji. Poniższy przykład obrazuje to chyba najlepiej
function foo(): int|INT {} // Disallowed
function foo(): bool|false {} // Disallowed
 
use A as B;
function foo(): A|B {} // Disallowed ("use" is part of name resolution)
 
class_alias('X', 'Y');
function foo(): X|Y {} // Allowed (redundancy is only known at runtime)

3. Koniec z niepotrzebnym pisaniem

Czy kojarzysz sytuację, w której przekazujesz do konstruktora wartość, aby później przypisać ją do prywatnej zmiennej?

class Point {
    public float $x;
    public float $y;
    public float $z;
 
    public function __construct(
        float $x = 0.0,
        float $y = 0.0,
        float $z = 0.0,
    ) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
    }
}

Koniec z tym! Od teraz możesz zrobić dokładnie tę samą robotę korzystając jedynie z konstruktora.

class Point {
    public function __construct(
        public float $x = 0.0,
        public float $y = 0.0,
        public float $z = 0.0,
    ) {}
}

Mała rzecz, a cieszy.

4. Wróćmy do typów

Pojawi się nowy typ mixed, który będzie można używać w zastępstwie do union types. Twórcy twierdzą, że ten typ pozwoli na bardziej precyzyjne wskazanie metod, które przyjmują / zwracają dowolny typ wartości.

Może to być dobry pomysł, aby zachować swego rodzaju spójność w kodzie. Nie wydaje się to jednak być rocket feature. W kodzie prezentować będzie się to następująco:

function test(mixed $params): mixed {
   //... smthg
}

5. Weź mą klasę

Korzystałeś/aś kiedyś z funkcji get_class()? Jestem pewny, że tak. PHP 8 przychodzi z konkurencyjnym sposobem sprawdzania klasy obiektu.

Wystarczy wywołać statyczną właściwość ::class, a otrzymamy klasę obiektu.

$object = new stdClass;
var_dump($object::class); // "stdClass"
 
$object = null;
var_dump($object::class); // TypeError

6. Wyjątki

Aktulanie musimy definiować zmienną jeśli chcemy przechwycić wyjątek. Nawet jeśli nigdzie nie korzystamy z tej zmiennej.

try {
    foo();
} catch (SomeException $ex) {
    die($ex->getMessage());
}

W wersji ósmej nie będzie takiej konieczności. Wystarczy zadeklarować catch.

try {
    changeImportantData();
} catch (PermissionException) { // The intention is clear: exception details are irrelevant
    echo "You don't have permission to do this";
}

7. Nowy interfejs

Spokojnie, nie chodzi o UI 😂 Chodzi o nowy, wbudowany interfejs Stringable. Co ciekawe jeśli chcesz, aby Twój obiekt implementował ten interfejs, to wystarczy, że będzie on zawierał implementacje metody __toString(). Nie musisz oznaczać jawnie implemetacji Stringable podczas deklaracji klasy, ale możesz to zrobić.

Dzięki temu interfejsowi będziemy mogli użyć następującego zapisu w union types string | Stringable. Czyli albo string, albo coś co może być odczytane jako string.

8. Nullsafe operator

Chcesz wywołać metodę / właściwość, ale nie masz pewności czy nie wywołujesz jej na czymś co jest null’em? Teraz robisz to pewnie tak:

$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}

Jeśli użyjesz PHP 8 możesz to robić w znacznie wygodniejszy sposób:

$country = $session?->user?->getAddress()?->country;

Jeśli na dowolnym etapie coś będzie zwracało wartość null, to całość zwróci wartość null. W innym wypadku przejdziemy do ostatniego wywołania.

To wszystko na dziś. Mam nadzieję, że ten artykuł był dla Ciebie przydatny i że czekasz na nową wersję PHP tak samo jak ja. Może być naprawdę ciekawie. Pamiętaj też, że wszystkie zmiany w nowej wersji znajdziesz na oficjalnej stronie https://wiki.php.net/rfc#php_80

Na koniec skrzynia skarbów – newsletter. Znajdziesz w nim link do zapisu na darmowe 45-minutowe konsultacje online. Nie ma go w innym miejscu, tylko w wiadomościach ode mnie. A razem z nim dostaniesz w mailach czyste złoto, czyli wiedzę. Zero spamu.

Zapisz się na newsletter

.

Tu też znajdziesz wiedzę za darmo

Po rozwiązania zajrzyj również na octocode’owy kanał na YouTube’ie. Będzie Twoją latarnią morską w programowaniu.

Lubisz słuchać rozmów z ciekawymi ludźmi z branży? Zapraszam na Prograduchy – podcast na luzie, a jednocześnie merytoryczny. Nie odpłyniesz.

X