DEV Community

Cover image for 🇩🇪 PHP 8.4: Was ist neu?
Pascal Kleindienst
Pascal Kleindienst

Posted on • Originally published at informatik-ninja.de

🇩🇪 PHP 8.4: Was ist neu?

Es dauert nicht mehr lange bis am 21. November 2024 die nächste PHP Version veröffentlicht wird. PHP 8.4 bringt einige interessante Neuerungen und Änderungen mit sich. Ein paar davon werde ich in diesem Beiträg näher vorstellen.

Property Hooks

Property Hooks gehören mit zu den größten Änderungen in der jüngsten PHP Vergangenheit - doch was sind property hooks überhaupt? Es kommt oft vor, dass man für Eigenschaften unterschiedliche Sichtbarkeiten oder Logiken für den lesenden und schreibenden Zugriff (get und set) braucht. Bisher hieß das meistens, dass man dafür eigene Methoden (getter und setter) geschrieben oder die magischen Methoden __get und __set benutzt hat. Property Hooks sollen dafür nun eine native Lösungen bieten und überflüssigen Boilerplate Code verhindern. Die Idee an sich ist nicht neu und daher hat man sich bei der Syntax von anderen Sprachen wie Kotlin, C#, und Swift inspirieren lassen.

class User
{
    public string $fullName {
        // Lesezugriff/Getter überschreiben
        get => $this->firstName . " " . $this->lastName
    }

    public string $firstName {
        // Schreibzugriff/Setter überschreiben. $value ist der zu setzende Wert.
        set {
            if (empty($value)) {
                throw new ValueError("Lastname must not be empty");
            }
            $this->firstName = $value;
        }
        get => $this->firstName;
    }

    public string $lastName {
        set {
            if (empty($value)) {
                throw new ValueError("Lastname must not be empty");
            }
            $this->lastName = $value;
        }
        get => $this->lastName;
    }

    public function __construct(string $firstName, string $lastName)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }
}
Enter fullscreen mode Exit fullscreen mode

Die Hooks sind optional und benötigen nicht beide Varianten (get und set). Im Beispiel oben entspricht $fullName einer virtual property, da nur ein get Hook vorhanden ist. Eine weitere interessante Tatsache ist, dass property hooks auch in Interfaces benutzt werden können:

interface HasFullName
{
    // Objekte die dieses Interface implementieren müssen eine lesbare $fullName Eigenschaft haben.
    // Das kann entweder eine traditionelle Eigenschaft oder ein "get" property hook sein.
    public string $fullName { get; }
}

class User implements HasFullName
{
    // Implementiert `HasFullName`, da $fullName eine lesbare Eigenschaft ist.
    public function __construct(public readonly string $fullName)
    {
    }
}
Enter fullscreen mode Exit fullscreen mode

RCF: https://wiki.php.net/rfc/property-hooks


new ohne Klammern

Eine weitere große Änderungen die mit PHP 8.4 kommt und Boilerplate Code reduziert: Aufrufe mit new müssen nicht mehr in Klammern eingeschlossen werden, um Methoden mit ihnen zu verketten.

// Vor PHP 8.4
$name = (new ReflectionClass($objectOrClass))->getShortName();

// Ab PHP 8.4
$name = new ReflectionClass($objectOrClass)->getShortName();
Enter fullscreen mode Exit fullscreen mode

Die Änderung betrifft aber nicht nur Methoden sondern funktioniert auch für Eigenschaften, Konstanten, statische Methoden etc.

RCF: https://wiki.php.net/rfc/new_without_parentheses


JIT Änderungen

PHP 8.4 hat ein paar Änderungen wie der JIT aktiviert bzw deaktiviert wird. Bisher musste man opcache.jit_buffer_size auf 0 setzen, um den JIT zu deaktivieren. Mit der neuen PHP Version gibt es dafür eine extra Einstellung:

opcache.jit=disable
opcache.jit_buffer_size=64m
Enter fullscreen mode Exit fullscreen mode

RCF: https://wiki.php.net/rfc/jit_config_defaults


Neuer HTML5 Support

Obwohl HTML 5 jetzt schon seit über 15 Jahren existiert, wird es von PHP bis jetzt nicht offiziell unterstützt. Mit PHP 8.4 wird nun die neue Klasse \Dom\HTMLDocument eingeführt, welche HTML5 Code vernünftig parsen soll. Die alte \DOMDocument Klasse, welche in der Theorie HTML 4 unterstützt, bleibt aus Gründen der Abwärtskompatibilität erhalten.

$doc = \Dom\HTMLDocument::createFromString($contents);
Enter fullscreen mode Exit fullscreen mode

RCF: https://wiki.php.net/rfc/domdocument_html5_parser


Neue Array Methoden: array_find

Frameworks wie Laravel haben solche Hilfsfunktionen schon etwas länger, sodass man es kaum glauben mag, dass array_find tatsächlich eine neue Funktion in PHP 8.4 ist.

Der Name mag evtl. etwas verwirrend sein, da array_find das erste(!) Element aus einem Array zurückliefert auf das eine bestimmte Bedingung zutrifft.

// Findet den ersten Benutzer mit mehr als 10 Zeichen im Namen
$user = array_find($users, function (User $user) {
    return strlen($user->name) > 10;
});
Enter fullscreen mode Exit fullscreen mode

Zu array_find kommen auch noch weitere Funktionen die ähnlich funktionieren: array_find_key, array_any und array_all. Wenn du mehr darüber erfahren möchtest, dann schaue dir doch den Beitrag "Neue Array Funktionen in PHP 8.4: array_find, array_find_key, array_any, und array_all" an.

RCF: https://wiki.php.net/rfc/array_find


Implizite nullable Parametertypen werden abgeschafft

PHP ein ein komisches Verhalten, bei dem eine typisierte Variable, welche als Standardwert null hat, automatisch nullbar (nullable) gemacht wurde.

function foo(Bar $bar = null) {} // Veraltet! Wurde von PHP automatisch umgewandelt
Enter fullscreen mode Exit fullscreen mode

Dieses Verhalten ist jetzt veraltet und wird mit PHP 9 entfernt werden. Die betroffenen Parameter müssen jetzt explizit als nullbar (nullable) ausgewiesen werden.

function foo(?Bar $bar = null) {}
Enter fullscreen mode Exit fullscreen mode

Deprecation: https://wiki.php.net/rfc/deprecate-implicitly-nullable-types

Top comments (0)