PHP 8.4, wydane 21 listopada 2024 roku, to kolejna znacząca aktualizacja popularnego języka programowania, skupiająca się na ułatwieniach dla deweloperów, poprawie wydajności oraz wprowadzeniu nowych narzędzi do pracy z obiektami i danymi. Ta wersja kontynuuje tradycję PHP, dodając funkcje takie jak haki właściwości (property hooks), asymetryczna widoczność czy nowe funkcje tablicowe. W artykule omówimy kluczowe nowości, z przykładami kodu, opierając się na oficjalnej dokumentacji i analizach ekspertów. PHP 8.4 jest kompatybilne wstecznie w większości przypadków, ale zawiera też deprecjacje, które warto monitorować podczas migracji.
Property Hooks: Rewolucja w pracy z właściwościami
Jedną z najbardziej oczekiwanych nowości są haki właściwości (property hooks), które pozwalają na definiowanie logiki dla operacji odczytu (get) i zapisu (set) bezpośrednio w deklaracji właściwości. To eliminuje potrzebę tworzenia oddzielnych getterów i setterów, upraszczając kod i czyniąc go bardziej czytelnym. Właściwości mogą być wirtualne (bez rzeczywistego pola), a haki działają też w interfejsach.
Przykłady użycia
Prosty hak get dla wirtualnej właściwości:
class Person {
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}
public string $firstName;
public string $lastName;
}
$p = new Person();
$p->firstName = 'Jan';
$p->lastName = 'Kowalski';
echo $p->fullName; // Wyświetla "Jan Kowalski"Hak set z walidacją:
class Person {
public string $age {
set {
if ($value < 0) throw new \InvalidArgumentException('Wiek nie może być ujemny');
$this->age = $value;
}
}
}Haki można definiować w interfejsach, co zapewnia spójność w implementacjach.
Asymetryczna widoczność właściwości
Asymetryczna widoczność pozwala na różne poziomy dostępu dla odczytu i zapisu właściwości. Na przykład, właściwość może być publiczna do odczytu, ale prywatna do zapisu. To ułatwia tworzenie immutable obiektów bez dodatkowych metod.
Przykład
class Book {
public private(set) string $title;
public function __construct(string $title) {
$this->title = $title;
}
}
$book = new Book('PHP dla zaawansowanych');
echo $book->title; // Działa
$book->title = 'Nowy tytuł'; // Błąd: prywatny setDziała też z promowanymi właściwościami w konstruktorze: public function __construct(private(set) string $title) {}.
Nowe funkcje tablicowe: array_find i spółka
PHP 8.4 wprowadza zestaw funkcji upraszczających pracę z tablicami: array_find(), array_find_key(), array_any() i array_all(). Te funkcje pozwalają na wyszukiwanie elementów za pomocą callbacka, sprawdzanie warunków dla wszystkich lub dowolnego elementu.
Przykłady
$posts = [
['title' => 'Krótki', 'content' => '...'],
['title' => 'Długi tytuł', 'content' => '...']
];
$firstLong = array_find($posts, fn($post) => strlen($post['title']) > 5);
echo $firstLong['title']; // "Długi tytuł"
if (array_all($posts, fn($post) => !empty($post['content']))) {
echo 'Wszystkie posty mają treść';
}Łańcuchowanie na new bez nawiasów
Teraz można łańcuchować metody bezpośrednio na obiektach tworzonych przez new, bez dodatkowych nawiasów wokół konstruktora.
Przykład
$name = new ReflectionClass($object)->getShortName(); // Bez (new ...)->...Wsparcie dla HTML5 w DOM
Nowa klasa \DOM\HTMLDocument zapewnia pełne wsparcie dla parsowania HTML5, naprawiając błędy starszego \DOMDocument. Stare klasy pozostają dla kompatybilności.
Przykład
$doc = \DOM\HTMLDocument::createFromString('<html><body>HTML5</body></html>');Lazy Objects: Leniwa inicjalizacja
Nowe API do tworzenia leniwych obiektów (lazy objects) za pomocą Reflection, opóźniające inicjalizację do pierwszego dostępu.
Przykład
$initializer = static function (MyClass $proxy): void {
$proxy->__construct(123);
};
$reflector = new ReflectionClass(MyClass::class);
$object = $reflector->newLazyProxy($initializer);Poprawki wydajności i JIT
Zmiany w Just-In-Time (JIT) kompilatorze, w tym nowe domyślne konfiguracje dla lepszej wydajności i mniejszego zużycia pamięci. Można wyłączyć JIT lub ustawić rozmiar bufora.
Inne nowości
- cURL: Nowe opcje jak
CURLOPT_PREREQFUNCTION,CURLOPT_DEBUGFUNCTION, i poprawki wcurl_getinfo(). - Intl: Nowe stałe w
NumberFormatteriIntlChar. - Atrybut #[\Deprecated]: Do oznaczania deprecated elementów z lepszymi komunikatami.
- Nowe funkcje:
request_parse_body()do parsowania multipart w niestandardowych żądaniach.
Deprecjacje i zmiany wstecznie niekompatybilne
PHP 8.4 wprowadza deprecjacje, np. implicit nullable typów, przestarzałe stałe w GD, czy zmiany w PDO. Zalecana migracja z PHP 8.3 z testami.
Wniosek
PHP 8.4 to krok w stronę bardziej ekspresyjnego i wydajnego kodowania, z naciskiem na obiekty i dane. Deweloperzy powinni zaktualizować swoje aplikacje, korzystając z nowych funkcji do uproszczenia kodu. Śledź oficjalną dokumentację i testuj zmiany w środowisku stagingowym.
Citations: