Hey Rowan,
On 01.07.26 18:43, Rowan Tommins [IMSoP] wrote:
On 1 July 2026 09:51:00 BST, Nick Sdot<[email protected]> wrote:
Just imagine you have to refactor an existing class with a primary constructor.
`readonly` would prevent what you want to do and must be removed. This would
require you to check and refactor the whole class, instead of just adding a
body. It doesn't make sense.
I don't understand this paragraph at all. The proposed syntax doesn't change
anything about how readonly works, as far as I know.
Any "primary constructor body" or "init block", whatever syntax it had, would
have exactly the same abilities and limitations regarding readonly properties as a normal
constructor. It would just be a different way of spelling it.
Rowan Tommins
[IMSoP]
Not sure how else I could explain it. What's not clear? Trying...
The limitation are property hooks in `readonly` classes. By having the
primary constructor body with "exactly the same abilities and
limitations regarding readonly properties as a normal constructor" you
*can* assign the property in question in the primary constructor body.
If there is no body, you cannot work around it. Unless, of course, you
don't use primary constructors. Which brings me back to "new, great
feature unusable in endless situations" -- which should not be our aim IMO.
You cannot do the below with a hook. Having the primary constructor body
solves it:
```
final readonly class Foo(Collection|array $value) implementsBar {
$this->items = $value instanceof Collection ? $value : new
Collection($value);
}=> {
// class body private Collection $items
}
```
I really like the general idea of this RFC, and I would like to have it.
But without bodies it's broken in too many situations.
--
Cheers
Nick