On 2024-06-28 23:06, Máté Kocsis wrote:
Hi Everyone,
I've been working on a new RFC for a while now, and time has come to
present it to a wider audience.
Last year, I learnt that PHP doesn't have built-in support for parsing
URLs according to any well established standards (RFC 1738 or the
WHATWG URL living standard), since the parse_url() function is
optimized for performance instead of correctness.
In order to improve compatibility with external tools consuming URLs
(like browsers), my new RFC would add a WHATWG compliant URL parser
functionality to the standard library. The API itself is not final by
any means, the RFC only represents how I imagined it first.
You can find the RFC at the following link:
https://wiki.php.net/rfc/url_parsing_api
Regards,
Máté
Hey,
That's great that you've made the Url class readonly. Immutability is
realiable. And I fully agree that a better parser is needed.
I agree with the otters that
- the enum might be fine without the backing, if it's needed at all
- I'm not convinced a separate UrlParser is needed,
Url::someFactory($str) should be enough
- getters seem unnecessary, they should only be added if you can be sure
they are going to be used for compatibility with PSR-7
- treating $query as a single string is clumsy, having some kind of bag
or at least an array to represent it would be cooler and easier to build
and manipulate
I wanted to add that it might be more useful to make all the Url
constructor arguments optional. Either nullable or with reasonable
defaults. So you could `$url = new Url(path: 'robots.txt'); foreach
($domains as $d) $r[] = file_get_contents($url->withHost($d))` and stuff
like that.
Similar modifiers would be very useful for the query stuff, e.g. `$u =
Url::current(); return $u->withQueryParam('page', $u->queryParam->page +
1);`.
Sure, all of that can be done in the userland as long as you drop
`final` :)
BR,
Juris