Pascal Kleindienst
Posted on November 23, 2024
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;
}
}
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)
{
}
}
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();
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
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);
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;
});
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
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) {}
Deprecation: https://wiki.php.net/rfc/deprecate-implicitly-nullable-types
Posted on November 23, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.