PHP 8 stanie się rzeczywistością już pod koniec tego roku!

Trwają kolejne etapy prac nad nową, główną wersją języka, która zostanie oficjalnie opublikowana pod koniec listopada 2020 roku.

PHP 8 jest nową główną wersją, co wiąże się z tym, że wprowadza kilka istotnych zmian, jak również nowych udogodnień takich jak union types, named arguments, WeakMap czy Match expression. Najbardziej jednak oczekiwanym ulepszeniem jest kompilator Just-in-time (JIT).
 

Just In Time

Szeroko znany rodzaj kompilacji zostanie wprowadzony także do PHP. Kompilator JIT to prawdopodobnie najbardziej rewolucyjna, a z pewnością najbardziej ceniona i wyczekiwana zmiana w nowej wersji. Na rynku IT głośno jest o niej już o dłuższego czasu.

Czym zatem jest JIT? Jak już wspomniano jest to kompilator PHP, który został zaimplementowany jako część rozszerzenia Opcache i ma na celu poprawienie wydajności aplikacji. Oczywiście już samo rozszerzenie Opcache temu służyło, bo jak wiemy język PHP jest językiem interpretowanym, co w skrócie oznacza, że skrypty PHP po uruchomieniu muszą zostać niejako zanalizowane i przetłumaczone przez interpreter np. PHP FRM czy interpreter CLI (Lexing/Tokeninzing -> Parsing -> Compilation -> Execute). Opcache w tym przypadku eliminuje potrzebę przechodzenia przedstawionego procesu przy każdym żądaniu, a to wszystko dzięki przechowywaniu prekompilowanego kodu bajtowego – Opcodes – w pamięci współdzielonej, który wówczas jest ciągle gotowy do wykonania na maszynie wirtualnej Zend. Opcache już w PHP 7.4 został ulepszony, ponieważ wprowadzono tu funkcję wstępnego ładowania – wróćmy jednak do JIT, który w tym przypadku idzie o kolejny krok do przodu!

JIT chce, aby niektóre z wspominanych Opcodes nie musiały być interpretowane przez maszynę wirtualną, a były skompilowane do instrukcji procesora już w czasie wykonywania. Wykorzystuje zatem bibliotekę o nazwie DynASM (Dynamic Assembler), która przekształca kod bajtowy na zrozumiały dla procesora kod assemblera. Podsumowując zatem kompilator Just In Time tłumaczy Opcodes na odpowiedni danej architekturze kod maszynowy, co obiecuje poprawę wydajności oraz użyteczności.

Choć prawdopodobnie wzrost wydajności w przypadku rzeczywistych aplikacji internetowych nie będzie spektakularny to ta zmiana otwiera drzwi do kolejnego poziomu języka i może przynieść wiele korzyści programistom w przyszłości. Na ten moment podsumowując JIT można powiedzieć, że każdy wzrost szybkości działania PHP jest mile widziany.
 

Nowe funkcje PHP 8

Poza JIT, PHP 8 zapowiada wiele innych nowych funkcji – część z nich jest już zatwierdzona, nad innymi w dalszym ciągu toczą się dyskusje. Skupiają się one na projektowaniu obiektowym, rdzeniu czy składni języka, a także dodaniu brakujących udogodnień. Poniżej przedstawiamy listę kilku wybranych dodatków oraz zmian.

  • Union types – pozwalają na określenie dwóch lub więcej typów argumentu przekazywanego do funkcji lub zwracanego z funkcji (należy jednak pamiętać, że typ void nie może być częścią takiej unii). Zmiana ta otwiera nowe możliwości programistyczne, funkcja ta może okazać się przydatna przede wszystkim do edycji starszego kodu lub korzystania z bibliotek zewnętrznych. Warto jednak zaznaczyć, że zaleca się, aby pisać kod w taki sposób, by unikać zwracania wielu typów argumentu z metody.

    public function ideo(int|string $parametr): int|null
     
  • Named arguments – umożliwiają wywołanie metody, do której przekazujemy parametry na podstawie ich nazwy, a nie jak było do tej pory – pozycji. Dzięki temu można pominąć kolejność przekazywanych parametrów, a także wartości domyślne czy opcjonalne. Jest to szczególnie pomocne w przypadku dużej ilości parametrów domniemanych, gdyż nie jest wówczas konieczne podawanie kolejno pustych stringów czy wartości null.   

    function foo(string $a, string $b, ?string $c = null, ?string $d = null)

    foo(
       b: 'value b',
       a: 'value a',
       d: 'value d',
    );

     
  • Nullsafe operator – funkcja znacznie zmniejszająca ilość kodu. Pozwala na wywołanie metody lub pobranie wartości wyrażenia, tylko wtedy gdy nie jest ono puste. Nowością jest tu możliwość zastosowania operatora właśnie z metodami. Dzięki temu możliwe jest tworzenie „łańcuszków” jak w przykładzie poniżej. Gdy ocena jednego z jego elementów zwróci null np. wywołanie getStartDate(), nie dojdzie do wywołania asDateTimeString() i wynikiem będzie null.

    $dateAsString = $booking->getStartDate()?->asDateTimeString();
     
  • Attributes zwane również adnotacjami, pozwalają na dodawanie metadanych poza blokami dokumentacji. Dostęp do atrybutów możemy uzyskać dzięki ReflectionClass.

    use App\Attributes\ExampleAttribute;

    #[ExampleAttribute]
    class Foo
    {
        #[ExampleAttribute]
        public const FOO = 'foo';

        #[ExampleAttribute]
        public $x;

        #[ExampleAttribute]
        public function foo(#[ExampleAttribute] $bar) { }
    }


    Jest to bardzo ważna zmiana, która w szczególności powinna zainteresować programistów backendu. Spodziewać się można, że w przyszłości frameworki wymagające PHP8 zaczną intensywnie używać atrybutów w swoich bibliotekach, a programista będzie je jedynie wykorzystywał w kodzie końcowym. Dzięki temu nie będzie konieczności, by zajmować się całym mechanizmem aplikacji.
     
  • Weak maps – PHP nie zdecyduje się na usunięcie obiektu z pamięci dopóki istnieje przynajmniej jedna referencja, która na niego wskazuje. Dzięki zastosowaniu WeakMap możemy oznaczyć te referencje, które nie są tak ważne, a wówczas PHP będzie mógł usunąć dany obiekt z pamięci nawet jeśli te referencje będą dalej na niego wskazywać. Może być to wykorzystywane między innymi w systemach cache – które ze swojej natury nie są stałe i referencje, które trzymają mogą być bez konsekwencji usunięte. Możemy spodziewać się szerszego wykorzystania tej właściwości w bibliotekach. Musimy natomiast wiedzieć, że obiekt może zostać usunięty, mimo że istnieje do niego referencja (tylko w WeakMap).
     
  • Constructor Property Promotion –  w ramach nowej funkcjonalności zmiennie wymienione w konstruktorze zostają automatycznie zdeklarowane i przypisane do wartości. Zmiana składni w tym przypadku redukuje ilość kodu podczas konstruowania obiektów, dzięki czemu jest on bardziej czytelny i mniej podatny na błędy.

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

     
  • Match expression – wyrażenie, które opiera się na działaniu podobnym do tradycyjnej instrukcji switch, z tą różnicą, że może zwracać wartość oraz nie wymaga stosowania instrukcji break, a także może łączyć warunki czy zwrócić wartość domyślną. Znacznie skraca to dotychczasowe wyrażenia switch.

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

     
  • Mixed type – dodanie mixed do listy typów w PHP sprawia, że można będzie go używać do określania zwracanego typu metod (dotychczas było to możliwe jedynie w docblokach). Warto jednak pamiętać, że w miarę możliwości należy zwracać jasno określony typ z metody. Mówiąc o nowym typie należy również wspomnieć, że zawiera on w sobie null, dlatego nie można mu nadać takiej wartości. Mixed pozwali poprawnie operować dowolnymi bibliotekami i właściwie oznaczać zwracany typ, w przypadku gdy korzystamy z bibliotek, które nie określają go jasno. Poza tym mixed może być również używany jako typ parametru lub właściwości.
     
  • Throw – słowo kluczowe throw zmienia się z instrukcji na wyrażenie, dzięki czemu może być używane np. w połączeniu z operatorami ?? lub ?: czy arrow functions. Powoli to na rzucanie wyjątków w wielu miejscach, w których dotąd nie było takiej możliwości.
     
  • ::class – dotychczas, by pobrać klasę danego obiektu stosowano funkcję get_class(), umożliwienie stosowania ::class na obiektach zastępuje tą funkcję – wystarczy jedynie zapis $object::class.
     
  • Wyłapywanie wyjątków bez zmiennej – bardzo często potrzebujemy złapać wyjątek i po prostu przerwać obieg funkcji bez konieczności operowania na samym wyjątku. PHP 8 daje tę możliwość, dzięki czemu większość GUI przestanie sugerować deklarację zmiennej, której nie używamy (Exception $e).

    try {
       // Something goes wrong
    } catch (MySpecialException) {
       Log::error("Something went wrong");
    }


    Warto jednak zaznaczyć, że dobrą praktyką jest logowanie wyjątków, dlatego też zalecamy, aby nie nadużywać powyższej funkcjonalności.
     
  • Końcowy przecinek w deklaracjach funkcji i dyrektywach use – jak sama nazwa wskazuje PHP 8 wprowadza możliwość dodania końcowych przecinków. Pragniemy jednak poddać pod wątpliwość czy jest to funkcjonalność korzystana czy też nie, gdyż można powiedzieć prowadzi to do rozluźnienia języka oraz brzydszego kodu. Promuje także bezmyślne CTRL+C CTRL+V, gdzie nie musimy się już przejmować kompletnie niczym. Utrwala również błędne przeświadczenie, że dodatkowe przecinki nie mają znaczenia. Warto zatem zastanowić się czy korzystać z tej możliwości.
     
  • str_contains, str_starts_with, str_ends_with – funkcje, których od dawna brakowało w PHP – chyba nikt nie był fanem strpos !== false. Każda z nich zwraca boolean i jest dużym udogodnieniem dla programistów, gdyż realizuje bardzo powszechne zadanie.
     
  • Walidacja metod abstrakcyjnych w traitach – kolejna zmiana dotycząca bardziej bibliotek i frameworków. Dzięki walidacji, język staje się bardziej wymagający, ponieważ nie pozwala to na mieszanie sygnatur metod abstrakcyjnych pomiędzy traitem, a klasą która z niego korzysta. Będzie to zatem działać na zasadach dokładnie takich jak w interfejsach, czyli sygnatura metody abstrakcyjnej zadeklarowana w traicie, będzie musiała mieć identyczną składnię jak w klasie.
     
  • Niższy priorytet łączenia stringów w wyrażeniach – dotychczas wyrażenie takie jak: echo "sum: " . $a + $b było interpretowane jako echo ("sum: " . $a) + $b, obniżając priorytet łączenia stringów PHP 8 wykona w pierwszej kolejności dodawanie, a następie łączenie, czyli echo "sum: " . ($a + $b)
     
  • Sortowanie – PHP 8 zapewnia stałe wyniki przy sortowaniu elementów, które są sobie równe. Każde wykonanie sortowania będzie prowadziło do tego samego wyniku, czego PHP 7 niestety nie gwarantowało.

Przedstawiona lista zmian zawiera wybrane, najważniejsze aspekty. Szczegółowe informacje oraz pełną listę nowych funkcji i ulepszeń można znaleźć w oficjalnym pliku NEWS oraz UPGRADING
 

Podsumowanie

Choć PHP 8.0 w dalszym ciągu jest w fazie rozwoju i do publikacji oficjalnej wersji brakuje jeszcze około 2 miesięcy, już teraz warto zapoznać się z czekającymi nowościami oraz je przetestować. Należy tu zaznaczyć także, że kilka istotnych zmian wymusza zaktualizowanie kodu aplikacji, jeśli chcemy by działały one w PHP 8 – stąd też by aktualizacja przebiegła jak najprościej warto być ze zmianami na bieżąco.

Może zainteresują Cię także

Jak wykorzystać e-learning w biznesie?

10 sierpnia 2020
Newsline.pl. Autor: Paweł Teper

Kompendium Digital Optimisation

7 sierpnia 2020
E-book przygotowali specjaliści związani na co dzień z Ideo. Wojciech Szymański, Dominika Śliwa, Łukasz Szymański, Tomasz Kwiatkowski i Kamil Ziomek.

Co możemy dla Ciebie zrobić?

×

Klienci o nas