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.
- 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.