Re: [RFC] Readonly Property Defaults

From: Date: Thu, 09 Jul 2026 19:18:05 +0000
Subject: Re: [RFC] Readonly Property Defaults
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-131844@lists.php.net to get a copy of this message
Hey Tim On 09.07.26 20:12, Tim Düsterhus wrote:
Hi On 2026-07-09 13:58, Nick Sdot wrote:
At the time __unserialize is called the object exists, and the property is initialised with the default value. So it fails in the same way a re-assignment in the constructor or reflection setValue() will fail. So, I wouldn't say "not a situation we have so far", but agree that spelling it out cannot be wrong. RFC section is updated, and your PR comment example added as a test!
Yes, it would be a situation we do not yet have so far: As far as I can tell there is no way for a readonly property to be preinitialized when unserialization happens. This means that it is not not observable that the non-hooked serialization path ignores readonly. What is effectively guaranteed right now is that using a custom __unserialize() hook that loops over the given array and assigns all properties will behave identically to non-hooked serialization. This would no longer be the case as of this RFC. There is two options here: - The non-hooked unserialization path must also error out when trying to unserialize into a readonly property with a default value. - __unserialize() must be able to unserialize into a readonly property with a default value, similarly to __clone(). But the current situation of “__unserialize() is less powerful than the standard unserialization” is not acceptable, because it prevents introducing __unserialize() on a class with a readonly property with default values.
It would not really have prevented using __unserialize() on a class with a readonly property with default values. But fair, I don't have a strong opinion here. Given that clone-with also allows modification of already initialised readonly properties your proposed option #2 is sound. I updated the PR and RFC
Best regards Tim Düsterhus
-- Cheers Nick

« previous php.internals (#131844) next »