Re: [RFC] Readonly property hooks
| From: | Claude Pache | Date: | Tue, 22 Jul 2025 09:18:57 +0000 |
| Subject: | Re: [RFC] Readonly property hooks | ||
| References: | 1 2 3 4 5 6 7 8 9 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-128175@lists.php.net to get a copy of this message | ||
> Le 22 juil. 2025 à 09:43, Rob Landers <rob@bottled.codes> a écrit :
>
> You can also implement this today, without using readonly:
>
> class Foo {
> public int $bar {
> get => $this->bar;
> set => empty($this->bar) ? $this->bar = $value : throw new
> LogicException("nope");
> }
> }
>
> https://3v4l.org/2JagR#v8.4.10
>
Your code is buggy, because
0 is “empty”:
https://3v4l.org/iUPvW#v8.4.10
> Should I be able to mark this class as readonly? I would think so.
I don’t think so.
If you want to *document* the intended invariant, you can put a @readonly tag in a phpdoc comment.
Adding a readonly keyword should *enforce* the invariant; the added value is that it
would choke on bugs like the one you wrote just above, making it debugging much easier.
> The readonly keyword simplified that greatly, however, readonly has been neutered compared to
> regular classes in the last couple of versions. There are so many edge cases and non-implemented
> features with them -- mostly due to this exact argument you are making -- that they're nearly
> worthless to actually define immutable value objects in today's PHP.
>
There are several issues with the readonly feature, mostly because of the “worse-is-better”
philosophy. But we can slowly correct the main issues instead of making them worse.
—Claude