Re: [RFC] [Discussion] Add WHATWG compliant URL parsing API

From: Date: Mon, 24 Feb 2025 09:15:01 +0000
Subject: Re: [RFC] [Discussion] Add WHATWG compliant URL parsing API
References: 1 2  Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
Hi

Am 2025-02-23 18:30, schrieb Gina P. Banyard:
2. I don't really understand how the UninitializedUriException exception can be thrown? Is it somehow possible to create an instance of a URI without initializing it?
It's mentioned in the RFC (it was not yet, when I read through the RFC):
This can happen for example when the object is instantiated via ReflectionClass::newInstanceWithoutConstructor()).
Incidentally this is *also* something that would be fixed by making the classes final, since it's illegal to bypass the constructor for final internal classes:
    <?php
    $r = new ReflectionClass(Random\Engine\Mt19937::class);
    $r->newInstanceWithoutConstructor();
results in:
    Fatal error: Uncaught ReflectionException: Class Random\Engine\Mt19937 is an internal class marked as final that cannot be instantiated without invoking its constructor
This seems unwise in general.
I agree. This exception is not really actionable by the user and more of a “should never happen” case. It should be prevented from appearing. The same is true for UriOperationException. The RFC says that it can happen for memory issues. Can this actually happen? My understanding is that the engine bails out when an allocation fails. In any case if a more graceful handling is desired it should be some generic OutOfMemoryError rather than an extension-specific exception. With regard to unserialization, let me refer to: https://externals.io/message/118311. ext/random uses \Exception and I suggest ext/uri to do the same. This should also be handled in a consistent way across extensions, e.g. by reproposing https://wiki.php.net/rfc/improve_unserialize_error_handling. And with “Theoretically, URI component reading may also trigger this exception” being a theoretical issue only, the UriOperationException is not actually necessary at all.
3. I'm not really convinced by using the constructor to be able to create a URI object. I think it would be better for it to be private/throwing and have two static constructor parse and tryParse, mimicking the API that exists for creating an instance of a backed enum from a scalar.
enums are little different in that they are a singleton. The Dom\HTMLDocument class with only named constructors might be a better comparison. But I don't have a strong opinion on constructor vs named constructor here. Best regards Tim Düsterhus

Thread (152 messages)

« previous php.internals (#126484) next »