Re: [RFC][Discussion] NotSerializable attribute
| From: | Dennis Snell via internals | Date: | Sat, 09 Dec 2023 16:00:52 +0000 |
| Subject: | Re: [RFC][Discussion] NotSerializable attribute | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-121972@lists.php.net to get a copy of this message | ||
> On Dec 9, 2023, at 4:55 PM, Robert Landers <landers.robert@gmail.com> wrote:
>
> On Sat, Dec 9, 2023 at 4:32 PM Dennis Snell via internals
> <internals@lists.php.net> wrote:
>>
>> Max, I love this idea.
>>
>> Would it make sense to flip the design though and add
>>
#[Serializable] with a new php.ini
>> setting?
>>
>> I’m thinking that almost every class I use, if not every single class, should not be
>> serialized.
>> If PHP had a flag to say “prevent all classes from serializing” then I could toggle
>> that flag and
>> avoid changing every single one of the potentially thousands of classes in my codebase, and
>> I wouldn’t have to worry about ensuring that everyone creating a new class remembers to
>> add
>> this attribute.
>>
>> For existing sites with serializable classes we can leave the default of this new flag to
>> the
>> permissive legacy behavior: every class is serializable. However, if you are willing and
>> have
>> vetted your code you can flip that flag and now _unless_ you explicitly declare
>> serializability
>> support, your classes don’t serialize or unserialize.
>>
>> That could point to a future where _no_ class serializes _unless_ it implements
>> __sleep()
>> and __wakeup() or
>> Serializable, which seems quite reasonable in my mind as a tradeoff
>> between explicitness and surprise.
>>
>> Warmly,
>> Dennis Snell
>>
>>> On Dec 9, 2023, at 1:30 PM, Max Semenik <maxsem.wiki@gmail.com> wrote:
>>>
>>> Hi, I'd like to propose a new attribute, #[NotSerializable]. This
>>> functionality is already available for internal classes - userspace should
>>> benefit from it, too.
>>>
>>> The RFC: https://wiki.php.net/rfc/not_serializable
>>> Proposed implementation:
>>> https://github.com/php/php-src/pull/12788
>>>
>>> Please let me know what you think.
>>>
>>> --
>>> Best regards,
>>> Max Semenik
>>>
>>> --0000000000006c4879060c12de83--
>>>
>>
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: https://www.php.net/unsub.php
>>
>
> Hi Dennis!
>
> The biggest downside for the reverse of #[NotSerializable] is that it
> would break almost everything that uses serialize (e.g., WordPress
> caching, some Symfony/Doctrine things, SQS transports, etc.). Also,
> there is the question of whether this would apply to json_encode() or
> just serialize().
Thanks Robert,
My idea was that the flag, by default, would preserve the existing behavior.
A large codebase could decide to wait to disable serialization until every class
is appropriately marked.
Either way I guess a large refactor is resolved. With #[Serializable] the onus
is on making sure that features requiring serialization are marked as such. With
#[NotSerializable] the onus is on classes (which are not concerned with serialization)
to opt-out of something unrelated.
The RFC calls this out and it is awkward to implement __wakeup() with a throwing
exception. #[Serializable] takes that a step further in linking the two concepts only
where they are related.
>
> PS. Please don't forget to bottom post on this list.
Thank you!
>
> Robert Landers
> Software Engineer
> Utrecht NL