2 Punkte von GN⁺ 2025-11-21 | 1 Kommentare | Auf WhatsApp teilen
  • 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_replace und strtolower nacheinander verbunden
  • Mit Clone with lassen sich beim Klonen eines Objekts gleichzeitig Eigenschaftswerte ändern

    • In der Beispielklasse Book wird dies in der Form clone($this, ['title' => $title]) verwendet
    • Wenn jedoch readonly-Eigenschaften von außen geklont werden, ist ein Zugriffsmodifizierer public(set) erforderlich
  • 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 static deklariert sein und dürfen nicht auf äußere Variablen zugreifen
  • 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() und array_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() und array_key_last()
  • Ein neuer URI-Parser wurde hinzugefügt

    • Über die Klasse Uri\Rfc3986\Uri stehen Methoden wie getHost(), getScheme() und getPort() zur Verfügung
    • Das vereinfacht die Analyse und Bearbeitung von URIs

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

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::$outerHTML wurde hinzugefügt
  • Die Exif-Erweiterung unterstützt nun HEIF/HEIC-Bilder
  • Beim Aufruf von filter_var() wurde das Flag FILTER_THROW_ON_FAILURE hinzugefü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_classes wird 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

 
GN⁺ 2025-11-21
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.

    • Ich finde, PHP ist ein Musterbeispiel für einen gelungenen großen Übergang.
      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.
    • Viele sagen, PHP sei komplexer geworden, aber mein einfacher Code aus PHP 5.3 läuft auch unter PHP 8 noch vollkommen problemlos.
      Man kann es kompliziert schreiben, aber man muss es nicht.
    • Ich frage mich, ob diese Kryptografie-Software vielleicht Zend war.
      Ich habe Mitte der 2000er mit Zend-bezogenen Tools gearbeitet und erinnere mich, dass sie ziemlich knifflig waren.
    • PHP 8 ist leicht genug zu verstehen, wenn man es von Anfang an richtig lernt.
      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 halte modernes PHP immer noch für eine gut lesbare Sprache.
      Ich habe 10 Jahre lang C++ genutzt, aber heute ist PHP für mich deutlich leichter zu lesen als moderner C++-Code.
    • Es reicht völlig, PHP 8 zu lernen. Das heutige PHP ist viel besser als früher.
    • Die meisten Software-Ökosysteme haben heute ein ähnliches Problem.
      Das Ziel der Einfachheit scheint verloren gegangen zu sein, und stattdessen werden immer mehr Features aufgestapelt.
    • Tatsächlich gilt dieser Wandel auch für andere Sprachen.
      Gerade im Webbereich ändern sich Dinge besonders schnell, und wer nicht mithält, fällt zurück.
    • Ich arbeite als Java-Spezialist und muss Kollegen trotzdem oft neue Features erklären.
      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.

    • Modernes PHP ist eine schnelle und großartige Sprache.
      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.
    • PHP war eine intuitive und angenehme Sprache.
      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.
    • Ich bevorzuge ein PHP-Backend gegenüber JS/TS + modernen Frameworks.
      Zusammen mit Frameworks wie Laravel ist das eine deutlich stabilere und reifere Umgebung.
    • Ich habe meine Karriere mit PHP aufgebaut und genieße bis heute diesen Modernisierungsprozess.
      Es ist wie Gitarre spielen oder Gedichte schreiben: Jeder kann es tun, aber es gut zu machen ist schwer.
    • Ich mag AzuraCast.
      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.

    • Auch C# und Java sind für Web-Backends wichtiger geworden und dadurch komplexer.
      Am Ende scheinen sich klassische objektorientierte Sprachen in eine ähnliche Richtung zu entwickeln.
    • Das Web selbst ist längst nicht mehr so einfach.
    • Es gibt auch Projekte wie NativePhp.
      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.
    • Ich habe den Artikel erst kritisiert, ohne ihn zu lesen, aber nach erneutem Lesen finde ich einige Features doch ganz gut.
      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.

    • Gute Ergänzungen, aber eigentlich hätten array_shift oder array_pop schon 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.

    • Die URI-Erweiterung ist schnell, überschneidet sich aber mit dem bestehenden parse_url().
    • Der Pipe-Operator ist Geschmackssache und kann die Konsistenz des Code-Stils beeinträchtigen.
    • Die clone-Verbesserungen sind nur minimale Änderungen.
    • #Discard/void ersetzt Funktionen statischer Analyzer.
    • Closures in Konstanten sind interessant, könnten aber zu komplexen Attributen (#attribute) führen.
    • Persistente cURL-Handles sind ein echter Performance-Gewinn.
    • 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, um shell_exec()aufzurufen, aber das ist jetzt deprecated. Dinge wiemkdir $dirname` habe ich oft so geschrieben.

    • Das ist ein Sicherheits-Antipattern.
      Wegen des Risikos der Injection von Shell-Metazeichen sollte man stattdessen PHPs mkdir() oder pcntl_exec() verwenden.