PHP 8 – co nowego (wydajność)
PHP 8
PHP 8 zostało oficjalnie wydane 26 listopada 2020 roku. Raczej nikt – kto wie co nieco o programowaniu – nie zaprzeczy, że była to najbardziej wyczekiwana aktualizacja tego roku. Z drugiej strony, dla właścicieli stron internetowych nie jest ona aż tak bardzo znacząca, jak chociażby PHP 7.
Nie trzeba być ekspertem by wiedzieć, że rozwój języka PHP trwa od przeszło 2 dekad. Nowe wersje pojawiają się wtedy, gdy potrzebne są zmiany w silniku w celu udostępnienia nowych funkcji i poprawek lub zwiększenia wydajności. W przypadku PHP 8 jest jednak trochę inaczej.
Dlaczego „trochę”? Najnowsza wersja nie skupia się tylko na ogólnikowych poprawkach czy szeregu pobocznych funkcji. Przynosi ona bowiem przełomowe zmiany w całościowym ‘działaniu’ omawianego języka. Mowa tutaj o kompilatorze JIT (Just In Time) oraz niektórych funkcjach składni.
Trzymając się naszej wieloletniej tradycji, dzisiejszy artykuł będzie w całości poświęcony najnowszej wersji PHP. Oprócz odpowiedzi na pytanie, co nowego w PHP 8, poruszymy też kwestie wydajności.
Notatka: JCHost.pl jest pierwszym dostawcą hostingu w Polsce, który wprowadził PHP 8 RC5 na swoich serwerach (22 listopada). ?
Wydajność PHP 8 vs. 7.4 vs. 7.0 vs. 5.6
Na wstępie wspomnieliśmy o tym, że PHP w wersji 8.0 to coś więcej niż tylko poprawki wydajności. Nie oznacza to jednak, że wydajność nie uległa poprawie. Wręcz przeciwnie! Podobnie jak w przypadku wszystkich poprzednich aktualizacji – widoczne jest znaczące przyśpieszenie.
Poniższa grafika przedstawia wydajność PHP 8 w porównaniu do PHP 7.4, PHP 7 oraz PHP 5.6. Testy te zostały wykonane przez zespół Phoronix.com i przedstawiają ogólny wynik benchmark PHPBench.
Omawiany benchmark dotyczy systemu opartego na serwerze Intel Core i9 9900KS. Wyniki są uśrednione i uwzględniają 2 testy: z włączonym oraz wyłączonym OPCache.
Oto wyniki benchmark dla PHP 8.0 (dev):
- 7,6% wyższy niż PHP 7.4.3
- 41,3% wyższy niż PHP 7.0.33
- 203,9% wyższy niż PHP 5.6.40
Ogólna wydajność (benchmark) jest dobrym odniesieniem, by poznać wyniki wydajnościowe względem witryn internetowych. Choć 7% i 41% można nazwać zauważalną poprawą, wciąż nie jest to najwyższy możliwy ‘przeskok’. Przy niektórych zastosowaniach, wzrost może wynieść nawet powyżej 200%!
Warto wiedzieć: PHP to język wykorzystywany nie tylko do tworzenia skryptów dla witryn internetowych. Używa się go też do innych zastosowań po stronie serwera, do przetwarzania danych z wiersza poleceń, a nawet do tworzenia części oprogramowania i aplikacji.
Sprawdź najszybszy na rynku hosting WordPress oraz hosting Ecommerce z PHP 8.
Co nowego w PHP 8
PHP 8 wprowadza ważne nowości, z których część dotyczy wszystkich programistów, a część skupia się na profesjonalnych zastosowaniach – takich jak np. rozwój sztucznej inteligencji.
Jako że mówimy o dużej aktualizacji, istnieje szansa, że będziemy zmuszeni wprowadzić ulepszenia w kodzie, aby był kompatybilny z najnowszą wersją.
W tym miejscu należy zaznaczyć, że jeśli byliśmy na bieżąco z nowymi wydaniami PHP, przejście na PHP 8 nie powinno być dramatem. Większość zmian została już bowiem wcześniej wycofana w wersjach 7.x. Ale do rzeczy!
Oto, co nowego w PHP 8:
JIT (kompilator Just In Time)
Kompilator JIT jest jedną z najczęściej opisywanych nowości w PHP 8 – pomimo, że był już dostępny do ‘eksperymentów’ w PHP 7.4 (domyślnie w trybie wyłączonym).
O co chodzi? PHP to tzw. język interpretowany, co oznacza, że ‘działa w czasie rzeczywistym’, a sam kod nie jest kompilowany. JIT ma za zadanie to zmienić, zwiększając przy tym wydajność.
Czy to aż tak ważne? W większości przypadków – nie. Gdy mowa np. o skryptach na stronach internetowych, JIT nie robi ogromnej różnicy. Inaczej jest, gdy na celowniku mamy renderowanie 3D czy obszerną analizę danych.
Warto wiedzieć: PHP JIT został zaimplementowany jako prawie że niezależny komponent OPcache. Może być włączany lub wyłączany w czasie kompilacji PHP oraz w czasie wykonywania. Po włączeniu, natywny kod jest przechowywany w dodatkowym regionie pamięci współdzielonej.
Union Types 2.0 (typy unii)
Typy są kluczową częścią PHP. Dzięki nim możemy przypisać zmienną jako liczbę całkowitą, wartość logiczną, null, itd.
class Number {
private int|float $number;
public function setNumber(int|float $number): void {
$this->number = $number;
}
public function getNumber(): int|float {
return $this->number;
}
}
W poprzednich wersjach istniała możliwość przypisania tylko jednego typu zmiennej. Wraz z aktualizacją do PHP 8, możemy przypisać dwa lub więcej typów. Tym samym nie ma potrzeby używania adnotacji PHPDoc, nazywanej przez wiele osób „nieporęcznym obejściem”.
WeakMaps (słabe mapy)
WeakMap to zbiór obiektów, do których istnieją tzw. słabe odwołania kluczy, które nie są usuwane jako elementy bezużyteczne.
$map = new WeakMap;
$obj = new stdClass;
$map[$obj] = 42;
var_dump($map);
Omawiane mapy są rozszerzeniem funkcji WeakRefs z PHP 7.4. Obie funkcjonalności niosą za sobą wiele zalet – najważniejszą jest skrócenie czasu oczekiwania na zapytanie, co jednocześnie oznacza wzrost wydajności.
Attributes v2 (atrybuty)
Od teraz język PHP będzie obsługiwał atrybuty, czyli małe fragmenty metadanych, które dodaje się do części kodu (np. funkcje, klasy, parametry, …).
<<ExampleAttribute>>
class Foo
{
<<ExampleAttribute>>
public const FOO = 'foo';
<<ExampleAttribute>>
public $x;
<<ExampleAttribute>>
public function foo(<<ExampleAttribute>> $bar) { }
}
$object = new <<ExampleAttribute>> class () { };
<<ExampleAttribute>>
function f1() { }
$f2 = <<ExampleAttribute>> function () { };
$f3 = <<ExampleAttribute>> fn () => 1;
<<ExampleAttribute>>
/** docblock */
<<AnotherExampleAttribute>>
function foo() {}
Programiści nie muszą już więc używać tzw. obejścia docblocks. Mogą dodać atrybuty w dowolnym miejscu, zaimportować je za pomocą use, a nawet konfigurować ich parametry.
Match Expression (wyrażenia dopasowania)
Wyrażenia dopasowania są przez niektórych programistów uznawane za jedną z najprzyjemniejszych funkcji w PHP 8, która ma poprawić składnię.
$result = match($input) {
0 => "hello",
'1', '2', '3' => "world",
};
Można je nazwać ulepszoną wersją dopasowań switch. Mogą one zwracać wartości, łączyć warunki, nie potrzebując przy tym długich instrukcji. Pod wieloma względami jest po prostu lepiej i bardziej przejrzyście!
Static Return and Mixed Types (statyczne zwroty i typy mieszane)
Zwroty w PHP służą do zwracania wartości funkcji. W ich przypadku, pewnym utrudnieniem była niekompatybilność z typem statycznym (self i parent – tak, static – nie). Nadejście PHP 8.0 zażegnuje ten problem.
class Foo
{
public function test(): static
{
return new static();
}
}
Częściowo powiązany z powyższym jest też nowy typ mieszany, tzw. pseudotyp, który reprezentuje wszystkie inne typy w PHP. Można go wykorzystać, jeśli będziemy zmuszeni pracować z kilkoma różnymi typami i nie będziemy mogli być zbyt ‘szczegółowi’.
Należy również pamiętać, że ponieważ mixed
zawiera już null
, nie można nadawać mu tej wartości ponownie. W innym wypadku, wystąpi błąd:
function bar(): ?mixed {}
// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type.
Warto wiedzieć: W wielu sytuacjach bardziej rozsądnym rozwiązaniem będzie wykorzystanie nowego typu unii, zamiast mieszanego.
Named arguments (nazwane argumenty)
Powszechnie wiadomo, że argumenty PHP pozwalają na przekazywanie danych do funkcji, bez przekazania domyślnych wartości. PHP 8 to zmienia.
function foo(string $a, string $b, ?string $c = null, ?string $d = null)
{ /* … */ }
foo(
b: 'value b',
a: 'value a',
d: 'value d',
);
Gdyby dosłownie przetłumaczyć oficjalne doniesienia, nazwane argumenty po prostu pozwalają na przekazanie parametru na podstawie jego nazwy, zamiast ‘kolejności’. W praktyce oznacza to czystszy i bardziej zwięzły kod.
Inne zmiany i nowe funkcje
Oprócz przełomowych zmian i nowości, PHP 8 oferuje również szereg poprawek w dotychczasowych funkcjach. Lista zmian zawiera kilkadziesiąt (lub kilkaset – zależnie od punktu widzenia) pozycji. Opisanie ich wszystkich w naszym poradniku byłoby co najmniej problematyczne.
Zdecydowaliśmy się więc podzielić pozostałe nowinki na części i opisać te pozycje, które albo są kluczowe (bądź interesujące), albo mogą powodować błędy podczas aktualizacji lub przenoszenia aplikacji do starszych wersji.
Oto lista nowych funkcji:
str_starts_with
orazstr_ends_with
– funkcja, która sprawdza, czy ciąg zaczyna lub kończy się określoną linią.str_contains
– funkcja o tym samym działaniu co poprzedniczka, z tym że sprawdza cały ciąg.fdiv
– funkcja związana z dzieleniem, która reaguje na dzielenie przez zero.get_resource_id
– funkcja służąca do uzyskania identyfikatora zasobu (np. połączenie z bazą danych).get_debug_type
– funkcja zbliżona do funkcjigettype
, z tym że zwraca więcej informacji (np. nazwa klasy).preg_last_error_msg
– funkcja, która odpowiada za wyświetlanie czytelnego dla człowieka komunikatu o błędzie.
Oto lista innych, kluczowych zmian:
- Nazwy Namespaced: Wraz z nadejściem wersji 8, nazwy stają się pojedynczym tokenem i nie mogą już mieć wewnątrz białych znaków.
- TypeError: Od teraz TypeError będzie konsekwentnie podkreślał i pokazywał funkcje wewnętrzne, co ma ogromny wpływ na tzw. kompatybilność wsteczną.
__construct()
: Do tej pory metody o nazwie pasującej do klasy były interpretowane jako konstruktory. By to zmienić, wprowadzono metodę__construct()
.- Nullsafe: Operator Nullsafe ma za zadanie poprawić czytelność kodu. Możemy użyć znaku
?
, aby napisać wszystkie instrukcje, zamiast wykorzystywaćif
. - Constructor Property Promotion: Ta tzw. ’promocja’ poprawia składnię i pozwala łączyć właściwości klasy i konstruktora w jedno.
- Throw expression: Od teraz throw nie jest już instrukcją, a wyrażeniem. Umożliwia to dodawanie wyjątków w wielu nowych, niedostępnych wcześniej miejscach.
- Rozwinięcie
:: class
: W PHP 8 możemy zaimplementować:: class
na obiektach, zamiast używać metodyget_class()
. - Końcowy przecinek: Dzięki aktualizacji, mamy przyzwolenie na opcjonalny, końcowy przecinek na liście parametrów. Obejmuje to listy funkcji, metod i ‘domknięć’.
- Niezgodne sygnatury metod: Z początkiem wersji 8, silnik PHP będzie zawsze zgłaszać błąd krytyczny dla niezgodnych sygnatur metod.
- Rozszerzenie JSON: Wcześniej JSON mogło zostać wyłączone. Od PHP 8 w górę, owe rozszerzenie będzie zawsze aktywne.
Oto lista ogólnych poprawek:
- Ostrzeżenia: Ostrzeżenia silnika PHP zostały przeklasyfikowane, aby pokazywały odpowiedni poziom istotności (np. błędy krytyczne, powiadomienia, ostrzeżenia, …).
- Raportowanie: Raportowanie błędów uległo znaczącej przebudowie. Niektóre błędy, które wcześniej były ciche i ignorowane, od teraz mogą pojawić się na naszym ekranie.
- Sortowanie: Sortowanie w silniku PHP jest uznawane za stabilne i niezawodne. Mimo to, PHP 7.0 wprowadziło duże zmiany, które PHP 8.0 w pewnym sensie rozszerza.
Jak ustawić PHP 8 na stronie?
W przypadku strony internetowej, ustawienie PHP 8.0 jest naprawdę bardzo proste! Cała operacja ogranicza się do kilku kliknięć, zajmuje pół minuty i odbywa się w panelu hostingowym naszej witryny.
Warto wiedzieć: W przypadku zmiany wersji PHP, kopia zapasowa witryny nie jest konieczna. W razie wystąpienia błędów HTTP, wystarczy zmienić wersję na tę, która była używana wcześniej.
Krok 1
Otwórz swój panel hostingowy, wybierz zakładkę „Dodatkowe funkcje” i kliknij w „Select PHP version”.
Krok 2
W polu wyboru „Bieżąca wersja PHP”, wybierz wartość „8.0” i kliknij przycisk „Ustaw jako bieżącą” – widoczny po prawej stronie.
Podsumowanie
PHP 8 to poważna aktualizacja najpopularniejszego języka skryptowego na świecie. Uwzględnia ona kilka przełomowych nowości, dziesiątki istotnych zmian i setki pobocznych poprawek. Do najczęściej opisywanych należą zdecydowanie JIT oraz typy unii.
Opisanie wszystkich zmian w wersji 8.0 byłoby ciężkie i niepotrzebne. Byłoby to wtedy nic innego, niż polskie tłumaczenie oficjalnych changelog’ów. Dlatego też po więcej informacji zapraszamy na oficjalną stronę wiki PHP 8.
Odbieramy telefony, odpisujemy na maile, nie ukrywamy kosztów, a dodatkowo oferujemy najszybsze pakiety hostingowe na rynku. Uważasz, że to zwroty marketingowe? Sprawdź sam/a!
Jeśli nie będziesz zadowolony/a, zwrócimy Ci pieniądze.
Twoje strony i sklepy przeniesiemy za darmo!
Jeżeli masz jakiekolwiek pytania, skontaktuj się z nami! Kliknij tutaj.
Chcesz dowiedzieć się o nas trochę więcej? Przejdź na stronę JCHost.pl.