PHP 8.5 introduces a new URI extension

2 weeks ago 2

PHP 8.5 introduces a new URI extension, which is a standards-compliant parser "for both RFC 3986 and the WHATWG URL standard as an always-available part of its standard library within a new 'URI' extension." The RFC has plenty of examples, but here's one from the PHP foundation announcement post showcasing the RFC 3986 Uri class:

use Uri\Rfc3986\Uri;

$url = new Uri('HTTPS://thephp.foundation:443/sp%6Fnsor/');

$defaultPortForScheme = match ($url->getScheme()) {

'http' => 80,

'https' => 443,

'ssh' => 22,

default => null,

};

// Remove default ports from URLs.

if ($url->getPort() === $defaultPortForScheme) {

$url = $url->withPort(null);

}

// Getters normalize the URL by default. The `Raw`

// variants return the input unchanged.

echo $url->toString(), PHP_EOL;

// Prints: https://thephp.foundation/sponsor/

echo $url->toRawString(), PHP_EOL;

// Prints: HTTPS://thephp.foundation/sp%6Fnsor/

When a parsing error occurs, constructing a new instance will throw a UrlValidationError exception, and using the static parse() method will return errors in a referenced variable:

$url = new Uri\WhatWg\Url("invalid url");

// Throws Uri\WhatWg\InvalidUrlException

$errors = [];

$url = Uri\WhatWg\Url::parse("invalid url", null, $errors);

// null is returned, and an array of UrlValidationError

// objects are passed by reference to $errors

/*

array(1) {

[0]=>

object(Uri\WhatWg\UrlValidationError)#1 (2) {

["context"]=>

string(11) "invalid uri"

["type"]=>

enum(Uri\WhatWg\UrlValidationErrorType::MissingSchemeNonRelativeUrl)

["failure"]=>

bool(true)

}

}

*/

URIs in Laravel

While it's notable that PHP 8.5 introduces an RFC-compliant URI component, it will take some time for the broader PHP community to leverage it fully. For example, until frameworks like Laravel define PHP 8.5 as the minimum version required, the framework cannot use any PHP 8.5 features. Of course, you can use PHP 8.5 features in your application even if frameworks lag a version or two behind the latest.

In the meantime, Laravel's URI class introduced in Laravel 11.35 uses the league/uri package under the hood, which implements RFC 3986. Laravel's URI class is powerful, and will work across Laravel >=11.35 💪.

use Illuminate\Support\Uri;

$uri = Uri::of('https://laravel-news.com')

->withPath('links')

->withQuery(['page' => 2])

->withFragment('new');

(string) $url; // https://laravel-news.com/links?page=2#new

$uri->path(); // links

$uri->scheme(); // https

$uri->port(); // null

$uri->host(); // laravel-news.com

Learn More

Read Entire Article