Re: [RFC] [Discussion] Add openStream() to XML{Reader,Writer}
| From: | Claude Pache | Date: | Wed, 24 Apr 2024 08:22:47 +0000 |
| Subject: | Re: [RFC] [Discussion] Add openStream() to XML{Reader,Writer} | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-123196@lists.php.net to get a copy of this message | ||
> Le 23 avr. 2024 à 21:23, Niels Dossche <dossche.niels@gmail.com> a écrit :
>
> On 22/04/2024 21:53, Larry Garfield wrote:
>> On Mon, Apr 22, 2024, at 6:41 PM, Niels Dossche wrote:
>>> Hi internals
>>>
>>> I'm opening the discussion for my RFC "Add openStream() to
>>> XML{Reader,Writer}".
>>> RFC link:
>>> https://wiki.php.net/rfc/xmlreader_writer_streams
>>>
>>> Kind regards
>>> Niels
>>
>> This seems quite reasonable to me overall. My one question is regarding the writer
>> version. Why is that not a static method, too? I would have expected that to be a "named
>> constructor" just like the reader.
>>
>> --Larry Garfield
>
> Hi Larry
>
> XMLReader already had these static methods that act as named constructors, but XMLWriter has no
> named constructors at the moment.
> The XMLWriter::openMemory() and XMLWriter::openUri() functions are instance methods that must
> be called after doing "new XMLWriter".
> If these two existing functions were static methods instead, I would've made
> XMLWriter::openStream() static too.
> So IOW, for consistency I followed the model of the existing XMLWriter methods.
>
> While it is possible to do the magic trick that XMLReader uses to have the open methods on
> XMLWriter both static and non-static, this is quite hacky and was only done to XMLReader for BC
> reasons.
That’s odd. The inconsistency was introduced (or at least sanctioned) in PHP 8.0. In PHP 7,
XMLReader::open() and XMLReader::XML() already worked when used both as static and non-static
methods, but triggered a deprecation warning when called statically. The deprecation warning was
removed in 8.0, regardless of the differing semantics when called statically and non-statically, and
regardless of the the inconsistency with corresponding XMLWriter methods.
Another point: when called statically on a subclass, both
XMLReader::open() and
XMLReader::XML() return an object of type XMLReader, not of the subclass:
https://3v4l.org/lCOAvJ
For that reason, they are unusable as static methods on a subclass. The new
openStream() method should work on instances, so that it will be usable on subclasses.
(And for the same reason, I think it was a mistake to undeprecate
XMLReader::{open,XML}() as static methods in 8.0.)
—Claude