PHP 8.5 nimmt eine URI-Erweiterung in die Standardbibliothek auf. Sie liefert die beiden unveränderlichen Klassen Uri\Rfc3986\Uri und Uri\WhatWg\Url. Eine zusätzliche Installation ist nicht nötig. Die RFC-3986-Seite nutzt uriparser. Die WHATWG-Seite basiert auf der Lexbor-Engine, die auch die DOM-API von PHP 8.4 antreibt.

uri-example.php
<?php
use Uri\Rfc3986\Uri;

$uri = new Uri('https://shop.example/catalog/electronics?page=2&brand=acme#reviews');

echo $uri->getScheme();
echo $uri->getHost();
echo $uri->getPath();
echo $uri->getQuery();
echo $uri->getFragment();

Die Erweiterung behebt Grenzen von parse_url(), das seit PHP 4 zu PHP gehört. Die Funktion gibt ein assoziatives Array mit je nach Eingabe unterschiedlichen Schlüsseln zurück. Eine URL-Validierung findet nicht statt, und der Wiederaufbau wird nicht unterstützt. Bei beschädigten oder nicht vertrauenswürdigen Eingaben sind unerwartete Ergebnisse möglich. Die neuen Klassen erzeugen typisierte Objekte und prüfen die Eingabe beim Parsen.

Die beiden Klassen stehen für unterschiedliche Standards. Uri\Rfc3986\Uri eignet sich für allgemeine URI-Syntax, darunter URNs, eigene Schemes und relative Referenzen. Uri\WhatWg\Url folgt dem browsernahen WHATWG-Modell für Weblinks. Ohne Basis-URL erwartet diese Klasse eine absolute URL. Sie verarbeitet Unicode- und ASCII-Formen internationalisierter Hostnamen und kann einen Hostnamen mit toAsciiString() als Punycode serialisieren.

Eine URN wie urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 gehört zum RFC-3986-Modell. Eine Webadresse wie https://exämple.com/path?query=1 kann mit der WHATWG-Klasse verarbeitet werden. Die RFC-Klasse stellt normalisierte Bestandteile über Methoden wie getScheme(), getHost(), getPath(), getQuery() und getFragment() bereit. Für unveränderte Werte gibt es unter anderem getRawUserInfo(), getRawUsername(), getRawHost() und getRawPath(). Beide APIs liefern Zugriff auf Authentifizierungsdaten. Die WHATWG-Klasse ergänzt URL-spezifische Methoden wie getAsciiHost() und getUsername().

Ungültige Eingaben lösen typisierte Ausnahmen aus. Beim RFC-3986-Modell können Uri\UriException oder Uri\InvalidUriException auftreten. Die WHATWG-Klasse kann Uri\WhatWg\InvalidUrlException auslösen. Statisches Parsen bietet auch einen Weg ohne Ausnahmen. Uri\Rfc3986\Uri::parse() gibt ein Objekt oder null zurück. Uri\WhatWg\Url::parse() kann zusätzlich ein übergebenes errors-Array mit UrlValidationError-Objekten füllen. Damit lassen sich Validierungsfehler, etwa bei Formulareingaben, auswerten.

Beide Klassen verwenden unveränderliche wither-Methoden. withScheme(), withPath(), withQuery(), withPort() und withFragment() erzeugen jeweils ein neues Objekt. Der ursprüngliche Wert bleibt erhalten. Für die Serialisierung stehen toString(), toRawString() und toAsciiString() bereit. Uri\WhatWg\Url::equals() und die entsprechende RFC-3986-Methode vergleichen normalisierte URI-Werte. UriComparisonMode::IncludeFragment legt fest, ob ein Fragment in den Vergleich einfließt.

PHP empfiehlt die neuen Klassen für neuen Code und für Migrationen, sofern bestehendes parse_url()-Verhalten nicht aus Kompatibilitätsgründen erhalten bleiben muss. Eine Validierung mit einem Parser und der spätere Abruf mit einem anderen Parser kann Sicherheitsrisiken erzeugen. Die URI-Erweiterung bietet PHP-Anwendungen eine gemeinsame Grundlage für standardkonformes Parsen, Validieren, Vergleichen und Ändern.