Co nowego w PHP 8.4

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:

PHP
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ą:

PHP
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

PHP
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 set

Dział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

PHP
$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

PHP
$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

PHP
$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

PHP
$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 w curl_getinfo().
  • Intl: Nowe stałe w NumberFormatter i IntlChar.
  • 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: