Przegląd
Duże wydania PHP zwykle łączą trzy rzeczy: wydajność, czytelniejszą składnię i mniej boilerplate’u. PHP 8.0 mocno uderza we wszystkie trzy obszary. Poniżej najważniejsze zmiany.
1. Wydajność
Kompilacja Just-In-Time (JIT)
PHP 8.0 wprowadza JIT, który kompiluje bytecode do kodu maszynowego w runtime. Największy zysk widać w zadaniach obciążających CPU.
Jak działa JIT:
Zamiast tylko interpretować bytecode w Zend Engine, JIT potrafi przełożyć gorące ścieżki na kod maszynowy tuż przed wykonaniem i zejść z narzutu.
JIT w praktyce
function fibonacci(int $n): int {
if ($n <= 1) return $n;
return fibonacci($n - 1) + fibonacci($n - 2);
}
$start = microtime(true);
echo fibonacci(35) . PHP_EOL;
echo "Czas wykonania: " . (microtime(true) - $start) . " sekund";
Z JIT takie obliczenia kończą się wyraźnie szybciej. Typowa aplikacja webowa często zyskuje mniej — tam nadal wygrywa I/O, baza i cache.
2. Nowa składnia
Promocja właściwości konstruktora
Przed PHP 8.0 właściwości trzeba było deklarować osobno i przypisywać w konstruktorze. Promocja skraca ten wzorzec do jednej linii.
Przed:
class Person {
private string $name;
private int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
}
Po PHP 8.0:
class Person {
public function __construct(private string $name, private int $age) {}
}
Mniej kodu, ta sama semantyka, czytelniejszy konstruktor.
Argumenty nazwane
Argumenty nazwane pozwalają podawać parametry po nazwie, bez sztucznego wypełniania kolejności nullami.
Przykład:
function createPost(string $title, string $content, ?string $author = null, ?array $tags = null) {}
createPost(title: "Nowy wpis", content: "PHP 8 jest niesamowite!", tags: ["PHP", "Update"]);
Kod wywołania jest czytelniejszy, zwłaszcza przy funkcjach z wieloma opcjonalnymi argumentami.
Operator nullsafe
Przed PHP 8.0 łańcuch wywołań na potencjalnym null wymagał kilku warunków:
$products = null;
$cart = $user ? $user->getCart() : null;
$products = $cart ? $cart->getProducts() : null;
Z operatorem ?-> wygląda to tak:
$products = $user?->getCart()?->getProducts();
Jeśli któryś element łańcucha jest null, całe wyrażenie zwraca null zamiast wywalić się na wywołaniu metody.
Wyrażenie match
match to zwięzła i ostrzejsza alternatywa dla switch.
Przykład:
$lang = $this->getLang();
$message = match ($lang) {
'pl_PL' => 'Witam!',
'en_US' => 'Hello!',
default => 'Hello!'
};
Kluczowe różnice:
- nie trzeba
break - wyrażenie od razu zwraca wartość
- porównania są ścisłe (
===)
3. Nowe funkcje
PHP 8.0 dodaje kilka bardzo praktycznych helperów:
str_contains()
Sprawdza, czy podciąg występuje w stringu.
$found = str_contains('Keep it simple stupid', 'simple'); // true
str_starts_with() oraz str_ends_with()
Sprawdzanie prefiksu i sufiksu bez kombinowania z strpos.
str_starts_with('PHP 8 is fast', 'PHP'); // true
str_ends_with('PHP 8 is fast', 'fast'); // true
get_debug_type()
Dokładniejsza wersja gettype() — dla obiektów zwraca nazwę klasy.
$var = new DateTime();
echo get_debug_type($var); // "DateTime"
4. Wycofania i breaking changes
Usunięte:
create_function(): wycofane w 7.2, usunięte w 8.0- Magic quotes (
get_magic_quotes_gpc()): ostatecznie usunięte
Ostrzeżenia / zmiany zachowania:
- Niejawne sklejanie
nullze stringiem (null . 'string') generuje ostrzeżenie each()zostało usunięte — używajforeach
Podsumowanie
PHP 8.0 to duży skok: JIT dla ciężkich obliczeń oraz składnia, która realnie skraca codzienny kod. Jeśli projekt i zależności są gotowe, przejście na 8.0 (a najlepiej dalej, na nowsze 8.x) nadal jest dobrym ruchem.