On Fri, Sep 6, 2024, at 20:07, Claude Pache wrote:
> 
> 
>> Le 5 sept. 2024 à 18:03, John Coggeshall <j...@coggeshall.org> a écrit :
>> 
>> 
>>> As per my previous email to the list, I have now created the official RFC 
>>> to deprecate calling json_serialize() on instances of classes marked with 
>>> ZEND_ACC_NOT_SERIALIZABLE.
>> 
>> I would suggest we take a step back from this and look at it with a bit more 
>> of a wider lens. It seems to me that this would be a good place to have an 
>> attribute (e.g. `#[NotSerializable]` )  that could be defined for any class 
>> (with `ZEND_ACC_NOT_SERIALIZABLE`  being automatically given this 
>> attribute)? It just seems to be a more holistic approach that makes sense, 
>> rather than basing it on internal engine stuff and/or limiting it to 
>> internal objects.
>> 
>> Coogle
>> 
> Hi,
> 
> An attribute adds very little value. It doesn’t add new capability, because 
> you can achieve the same effect with a serialiser that throws 
> unconditionally; it is just a nicer syntax. People generally don’t bother 
> making their classes unserialisable unless they have a good reason; having an 
> attribute won’t really change that.

You also need to ensure that you make it final, as someone could extend your 
class and make your borked serializer work.

> The core problem is that objects are json-serialisable by default, although 
> most of them are not supposed to be json-serialised. Taking a second step 
> back, if we really want to solve the issue, one should:
> 
> * for internal classes, determine which ones could be json-serialisable (at 
> least, stdClass); for all other classes, `json_encode(...)` shall be disabled 
> (after a deprecation period);
> * for user-defined classes, the user shall opt into json-serialisability, 
> either by extending a json-serialisable class, or by using an {attribute / 
> magic method / interface} (chose your bikeshed colour).
> 
> —Claude

I also agree with this to a point: there is the 
https://www.php.net/manual/en/class.jsonserializable.php interface, after all.

— Rob

Reply via email to