Die Neuerungen in PHP 8.5
(stitcher.io)- PHP 8.5 ist ein größeres Update mit mehreren Funktionen wie dem Pipe-Operator, clone with und einem neuen URI-Parser
- Der Pipe-Operator vereinfacht Ketten von Funktionsaufrufen und verbessert damit Lesbarkeit und Wartbarkeit
- Die Funktion Clone with ermöglicht es, beim Klonen von Objekten gleichzeitig Eigenschaftswerte zu ändern; bei einigen readonly-Eigenschaften gibt es Einschränkungen
- Mit
#[NoDiscard],(void)-Cast, Unterstützung für Closure-Konstantenausdrücke und Ausgabe von Backtraces bei fatal errors werden die Entwicklerfunktionen erweitert - Die Version enthält außerdem Detailverbesserungen bei Array-Verarbeitung, Eigenschaftsvalidierung und der Abschaffung nicht standardisierter Casts sowie Änderungen mit Bezug zur Abwärtskompatibilität
Wichtige neue Funktionen
-
Mit der Einführung des Pipe-Operators (
|>) kann das Ergebnis einer Funktion in verketteter Form direkt an die nächste Funktion übergeben werden- Unterstützt eine Struktur, in der Daten schrittweise transformiert werden, statt verschachtelte Funktionsaufrufe zu verwenden
- Im Beispielcode werden
trim,str_replaceundstrtolowernacheinander verbunden
-
Mit Clone with lassen sich beim Klonen eines Objekts gleichzeitig Eigenschaftswerte ändern
- In der Beispielklasse
Bookwird dies in der Formclone($this, ['title' => $title])verwendet - Wenn jedoch readonly-Eigenschaften von außen geklont werden, ist ein Zugriffsmodifizierer
public(set)erforderlich
- In der Beispielklasse
-
Hinzugefügt wurden das Attribut
#[NoDiscard]und der(void)-Cast- Damit können Funktionen gekennzeichnet werden, die eine Warnung auslösen, wenn ihr Rückgabewert ignoriert wird
- Mit dem
(void)-Cast lässt sich diese Warnung unterdrücken
-
Durch Verbesserungen bei Closures können Closures und First-Class Callable Objects in Konstantenausdrücken verwendet werden
- Im Beispiel werden sie in einem Attribut in der Form
#[SkipDiscovery(static function (...))]definiert - Solche Closures müssen zwingend als
staticdeklariert sein und dürfen nicht auf äußere Variablen zugreifen
- Im Beispiel werden sie in einem Attribut in der Form
-
Hinzugekommen ist die Ausgabe von Backtraces bei fatal errors
- Stack-Trace-Informationen, die zuvor nicht angezeigt wurden, sind nun in Fehlermeldungen enthalten und erleichtern das Debugging
Funktionen rund um Arrays und URI
-
Die Funktionen
array_first()undarray_last()wurden hinzugefügt- Sie geben das erste bzw. letzte Element eines Arrays auf einfache Weise zurück
- Damit ersetzen sie kompliziertere Zugriffe über
array_key_first()undarray_key_last()
-
Ein neuer URI-Parser wurde hinzugefügt
- Über die Klasse
Uri\Rfc3986\Uristehen Methoden wiegetHost(),getScheme()undgetPort()zur Verfügung - Das vereinfacht die Analyse und Bearbeitung von URIs
- Über die Klasse
Funktionen zu Attributen und Validierung
- Das Attribut
#[DelayedTargetValidation]wird eingeführt- Damit lässt sich der Prüfzeitpunkt einiger Attribute wie
#[Override]von der Compile-Zeit auf die Laufzeit verschieben - Ziel ist es, Probleme bei der Abwärtskompatibilität abzumildern
- Damit lässt sich der Prüfzeitpunkt einiger Attribute wie
Weitere kleinere Änderungen
- Unterstützung für asymmetrische Sichtbarkeit (asymmetric visibility) bei statischen Eigenschaften
- Attribute können nun auch Nicht-Klassen-Konstanten zugewiesen werden
- Constructor Property Promotion kann nun auch auf final-Eigenschaften angewendet werden
- Das Attribut
#[\Override]kann nun auch auf Eigenschaften angewendet werden - Die Eigenschaft
Dom\Element::$outerHTMLwurde hinzugefügt - Die Exif-Erweiterung unterstützt nun HEIF/HEIC-Bilder
- Beim Aufruf von
filter_var()wurde das FlagFILTER_THROW_ON_FAILUREhinzugefügt
Veraltete und inkompatible Änderungen
- Die Verwendung nicht standardisierter Cast-Namen wie
(boolean)und(integer)wird eingestellt - Die Nutzung von Backticks (``` ) als Alias für
shell_exec()wird als veraltet markiert - Die Funktion zur Neudeklaration von Konstanten wird eingestellt
- Die ini-Einstellung
disabled_classeswird entfernt - Die vollständige Liste der Änderungen und veralteten Funktionen findet sich in der PHP-8.5-Upgrade-Dokumentation
Gesamte Zusammenfassung
- PHP 8.5 verbessert die Entwicklererfahrung insgesamt in Bereichen wie Lesbarkeit des Codes, Debugging, Attributverarbeitung und Array-Manipulation
- Der Pipe-Operator und der URI-Parser haben direkten Einfluss auf die Vereinfachung von Code in der Praxis
- Verzögerte Attributvalidierung, neue Array-Funktionen und Backtrace-Ausgabe erhöhen Wartbarkeit und Stabilität
- Durch die Abschaffung einiger nicht standardisierter Syntaxformen und Einstellungen wird eine Bereinigung des Codes erforderlich
- Insgesamt ist dies ein Release mit Fokus auf mehr sprachlicher Konsistenz und besserer Entwicklerfreundlichkeit
1 Kommentare
Hacker-News-Kommentare
Ich liebe PHP immer noch.
Vor 23 Jahren habe ich Kryptografie-Software für PHP gebaut, und sie funktioniert bis heute einwandfrei.
Ich betreibe auch heute noch einen PHP-Newsletter, und es gibt nach wie vor eine starke Community.
Ich nutze auch Python und Node.js, aber für schnelle und einfache Aufgaben komme ich am Ende immer wieder zu PHP zurück.
Allerdings ist die Sprache seit PHP 5 deutlich komplexer geworden, und das wirkt auf mich wie ein zweischneidiges Schwert.
Während Python von 2 auf 3 wechselte, entwickelte sich PHP von 5.2→5.3 und 5.6→7.0 weiter.
Durch Namespaces, PSR0-Autoloading, Parser-Verbesserungen und Ähnliches wurden Geschwindigkeit und Struktur stark verbessert.
Mit jedem Update wurde die Sprache schrittweise verbessert, ohne die Kompatibilität zu brechen, und dank Warnungen und Shims konnte alter Code weiterlaufen.
Dass PHP 6 gestrichen wurde, lag an Änderungen bei der String-Verarbeitung, und rückblickend war das wohl eine kluge Entscheidung.
Es war ein Projekt, das die Sprache und die Community respektiert hat, die vielen Menschen lange den Lebensunterhalt gesichert haben.
Man kann es kompliziert schreiben, aber man muss es nicht.
Ich habe Mitte der 2000er mit Zend-bezogenen Tools gearbeitet und erinnere mich, dass sie ziemlich knifflig waren.
Wenn man sich mit PSR sowie mit Sicherheit und Features beschäftigt, ist es eine viel stabilere und leistungsfähigere Sprache geworden.
Die Entwicklung seit PHP 5 ist beeindruckend, aber damit ist auch das Problem der gewachsenen Komplexität gekommen.
Für Leute, die mit älteren Versionen gelernt haben, wirken moderne Codebasen fremd und sind schwer nachzuvollziehen.
Für die Community ist das eine Stärke, für Entwickler, die zurückkehren wollen, aber auch eine Hürde.
Ich habe 10 Jahre lang C++ genutzt, aber heute ist PHP für mich deutlich leichter zu lesen als moderner C++-Code.
Das Ziel der Einfachheit scheint verloren gegangen zu sein, und stattdessen werden immer mehr Features aufgestapelt.
Gerade im Webbereich ändern sich Dinge besonders schnell, und wer nicht mithält, fällt zurück.
PHP wird besonders oft von Einsteigern für ihre erste Website genutzt, deshalb wirken die Veränderungen dort vielleicht stärker als in anderen Sprachen.
Viele Leute scheinen sich für PHP zu schämen, ich aber nicht.
Ich kenne mich mit der Sprache nicht besonders gut aus, aber ich weiß, dass es viele großartige Projekte gibt.
Mein derzeitiges Lieblingsprojekt in PHP ist BookStack, das ich als Familien-Wiki nutze.
Es gibt immer noch viele Websites, die auf gut gepflegten PHP-Stacks laufen.
Ich habe 2021 bis 2023 produktives PHP genutzt, und die Probleme lagen weniger in der Sprache selbst als in veralteten Codebasen und niedrigen Gehältern.
Es gibt viel Altcode aus der PHP-4-Zeit, und die Datenzugriffsmuster unterscheiden sich stark, was die Wartung mühsam macht.
Aber bei der Migration auf PHP 8 hat sich die Codequalität stark verbessert.
Ich würde für ein neues Projekt wohl nicht PHP wählen, aber an einem modernen Laravel-Projekt würde ich gern mitarbeiten.
Allerdings konnten Einsteiger leicht ohne Sicherheitsverständnis damit anfangen, weshalb Probleme wie SQL-Injection häufig waren und die Sprache den Ruf bekam, unsicher zu sein.
Zusammen mit Frameworks wie Laravel ist das eine deutlich stabilere und reifere Umgebung.
Es ist wie Gitarre spielen oder Gedichte schreiben: Jeder kann es tun, aber es gut zu machen ist schwer.
Es macht Spaß, direkt im Code zu lernen und einen Radio-/Musikserver selbst zu hosten.
PHP ist mit jedem Update zu einer immer komplexeren Sprache geworden.
Es ist doch immer noch primär eine Websprache, also frage ich mich, warum sie sich so entwickelt.
Am Ende scheinen sich klassische objektorientierte Sprachen in eine ähnliche Richtung zu entwickeln.
Selbst wenn es nur eine Sprache fürs Web wäre, gäbe es genug Gründe, sie weiterzuentwickeln. Die Developer Experience zu verbessern, ist immer sinnvoll.
array_first(),array_last()sind nützlich, aber der Pipe-Operator könnte der Wartbarkeit schaden.Da er nur unäre Funktionen unterstützt, kann er bei komplexeren Funktionen sogar eher Bugs verursachen.
Das Interessanteste an der Ankündigung von PHP 8.5 ist für mich die Stabilität und Reife der Sprache.
Erstaunlich, dass PHP noch vor GTA6 array_first, array_last und fatal error stack trace bekommt.
array_shiftoderarray_popschon gereicht.Dass PHP ständig neue Funktionen und Syntax bekommt, erhöht langfristig die Wartungskosten.
In den offiziellen Release Notes wirken manche Features in ihrem Nutzen fraglich.
parse_url().clone-Verbesserungen sind nur minimale Änderungen.#Discard/voidersetzt Funktionen statischer Analyzer.#attribute) führen.array_first()ist eher syntaktischer Zucker und wird in großen Projekten vermutlich kaum verwendet.Offizielle PHP-8.5-Release-Notes
Die Beispiele für den Pipe-Operator lassen in den meisten Sprachen einfach die übliche Verwendung von temporären Variablen weg.
Auch das URL-Parsing-Beispiel wurde nicht direkt mit
parse_url()verglichen.parse_url()hält sich nicht vollständig an den Standard und ist schwach bei relativen URLs.Die neue Funktion
uri()ist sauberer, und wenn noch partielle Funktionsapplikation dazukommt, werden Pipe-Ketten besser lesbar sein.In der PHP-CLI habe ich **Backticks (
)** verwendet, umshell_exec()aufzurufen, aber das ist jetzt deprecated. Dinge wiemkdir $dirname` habe ich oft so geschrieben.Wegen des Risikos der Injection von Shell-Metazeichen sollte man stattdessen PHPs
mkdir()oderpcntl_exec()verwenden.