On 29.06.26 08:17, Rob Landers wrote:
Hello internals,
I'd like to put forward Primary Constructors
<https://wiki.php.net/rfc/primary-constructors> for comment.
An implementation PR will be opened later today (UTC), and the RFC
updated with this discussion thread.
— Rob
Hey Rob,
thanks again for the work you did put into this!
Unfortunately you are not allowing bodies for primary constructor. This
means there will be no way to work around the "`readonly` classes don't
allow property hooks" problematic; except using conventional
constructors (`private(set)` is not the same; hence my previous
"readonly hooks" RFC).
If "use conventional constructors, if you need `readonly` classes"
stands, then the same can be argued for everything else in the RFC.
Why would we introduce a whole new syntax, but then only make it work
for limited use-cases such as "trivial validation or normalization"?
Your example:
```
class Money(
public readonly int$amount,
public readonly string$currency = 'USD',
) {}
class Money{
public function __construct(
public readonly int$amount,
public readonly string$currency = 'USD',
) {}
}
```
Pro:
- two lines less
- construction at top of class (love it!)
Con:
- primary constructor body not supported
- new syntax with gotchas to keep in mind
- for readonly classes it adds two property `readonly` in exchange to
writing two lines less
- requires refactoring to conventional constructor as soon as it gets
"non-trivial" (I'd argue a lot of things that do not work are actually
still trivial).
Given the limitations, is this alone adding enough value? What is the
actual gain?
Adding a new syntax to the language but then lock it down as proposed
here does not feel right.
As is, I feel the proposal is too thin, it would unfortunately be yet
another feature that feels mid, incomplete, and introduces new gotchas.
Sorry, IMO, not worth it.
If we would say we want new and neat syntax sugar to write constructors
at the top of the class, I am all for it!
But then they would need to work like actual constructors (otherwise
it's not just sugar), without accepting yet another set of limitations
and weirdness's in a different place.
What I roughly have in mind:
```
readonly class Point(public int $x, int $id = 0) extends Base($id)
implements Foo {
// normal constructor body behaviour
} => {
// class body
}
```
--
Cheers
Nick