Re: [PHP-DEV] [RFC] Primary Constructors

[email protected] (Nick Sdot)
Newsgroups php.internals
Message-ID <[email protected]>
On 30.06.26 03:47, Rob Landers wrote:
>
>
> On Mon, Jun 29, 2026, at 21:20, Nick Sdot wrote:
>>
>> Hey Rob,
>>
>> On 29.06.26 21:35, Rob Landers wrote:
>>> On Mon, Jun 29, 2026, at 13:42, Nick Sdot wrote:
>>>>
>>>> Hey Rob,
>>>>
>>>> On 29.06.26 19:03, Rob Landers wrote:
>>>>> Hi, Nick,
>>>>>
>>>>> On Mon, Jun 29, 2026, at 10:47, Nick Sdot wrote:
>>>>>> Hey Rowan,
>>>>>>
>>>>>> On 29.06.26 16:00, Rowan Tommins [IMSoP] wrote:
>>>>>> > On 29/06/2026 07:31, Nick Sdot wrote:
>>>>>> >>
>>>>>> >> If "use conventional constructors, if you need `readonly` 
>>>>>> classes"
>>>>>> >> stands, then the same can be argued for everything else in the 
>>>>>> RFC.
>>>>>> >>
>>>>>> >
>>>>>> > For the record, my view is completely the opposite: if the new 
>>>>>> syntax
>>>>>> > allows everything a normal constructor does, just in a slightly
>>>>>> > different position, it will lead to endless style discussions 
>>>>>> of which
>>>>>> > to use.
>>>>>>
>>>>>>
>>>>>> That's a fair opinion, and not unexpected. Personally, I oppose
>>>>>> introducing more inconsistencies to PHP. Looks like that we need 
>>>>>> to have
>>>>>> these discussions then?
>>>>>
>>>>> There's no inconsistency here.
>>>>
>>>> The inconsistency is that we will have two kind of constructors. 
>>>> One that has a body, one has not. It's a completely new concept, 
>>>> but you talk about syntax sugar.
>>>
>>> There's only one constructor; PHP doesn't allow you to have 
>>> different constructors. You choose the spelling that makes the most 
>>> sense for your class and objectives. This is just declaration, not 
>>> logic.
>> Dude...
>>>
>>>>> It only prevents you from initialization/validation in a body 
>>>>> because there are no bodies. 
>>>>
>>>>
>>>> Right. Which makes them useless in endless situations.
>>>>
>>>
>>> Of all the PHP code on my machine (production application code, 
>>> frameworks like symfony/laravel/doctrine) ... it's about 30-40% of 
>>> all constructors that are completely empty. I also sent an LLM to 
>>> look further at things that could benefit from this (ie, promote 
>>> properties on older code instead of just empty constructors). It 
>>> came back with 71% of Laravel and 61% of Symfony that could use 
>>> Primary Constructors. I'm not saying they should go rewrite their 
>>> code or anything like that, but that basically means at least 1-2 
>>> out of 3 classes written in a given codebase could use primary 
>>> constructors to simplify their construction and make it easier to skim.
>>>
>>> My 2¢: I don't think this is useless.
>> I did not say it is useless, I did say it is useless in endless 
>> situations. And it is avoidable, by allowing a body.
>>>>> If you need a body, use a constructor -- that's what they're for. 
>>>>
>>>> But then I cannot benefit from the position (at the top of the 
>>>> class) of the primary constructors, which I really would like. 
>>>> Shouldn't we try to make each new feature as useful as possible? 
>>>> What are the actual blockers to not support primary constructor bodies?
>>>
>>> There is nothing preventing a follow-up RFC from being proposed, but 
>>> as well as anonymous classes, it deserves its own RFC. There's a lot 
>>> of syntax to bike-shed, as well as questions like "if I give a body, 
>>> can I still use a parent constructor shortcut?" It is not 
>>> straightforward and nor should it be. I fully explored this in the 
>>> Records RFC, and many people pushed back on the logic, even pointed 
>>> out unsoundness in what seemed like an otherwise sound design.
>>
>> Well, this is going to be more of a general thing, nothing exclusive 
>> to your RFC... But this is how we end up with more and more half 
>> finished and awkward (to not say broken) features in PHP. While I 
>> understand and generally support "get the minimum in and iterate 
>> later" from the perspective of RFC authors, reality shows that 
>> "later" can be either years later or very likely never at all. 
>> Though, we will have to deal with the unfinished/broken "minimum" 
>> solutions. How many more of these do we want to add?
>>
>> To name three from the top of my mind:
>> 1/ we still don't have stringable enums
>> 2/ we still don't have a solution for widening the type of a promoted 
>> property's set hooks (hi #16638), and of course
>> 3/ my beloved readonly hooks themselves. ;)
>>
>> You know, I don't argue for the sake of it. It's just too often that 
>> my concerns turn out to be valid, eventually. See my comment to 
>> #16638; we probably should just have skipped hooks on promoted 
>> properties unless there would have been a solution before release. 
>> Now we have to deal with this inconsistent and broken behaviour for 
>> forever (?), because people are already busy with the next features. 
>> If we already not get such features right (no blame to anyone -- it's 
>> complex!), imagine what a disaster introducing native inline generics 
>> (with all its "good follow up RFC") could have lead to, if they would 
>> have made it in the language before PHP even has the will to agree on 
>> an internals approved official PHPDoc types spec that can prove 
>> itself over a few years without breaking code.
>>
>> Point is, I care. That's why I voice my concerns.
>>
>
> The irony here is that this is a follow-up RFC born weeks after 
> someone reminded me about this part of it. It was abandoned due to 
> comments like this.
>
> I do think I have a track record of attempting interesting RFCs and 
> then abandoning them because it's clear nobody wants them. And that's 
> fine. As I've stated multiple times in this thread, it would explode 
> the complexity of the RFC. Probably half of it would just be about 
> constructors. That's clear it should be a separate RFC, and if I did 
> present it, you (or someone else) would argue that it needs to be 
> broken up -- just like the records RFC.
>
> I show up, because I care as well; but damn, everyone can't always 
> have cake.
>
> — Rob
I loved the Records RFC -- see my comments on Twitter about it -- and I 
would not have asked you to break it up. But I would have asked why we 
need both inline and conventional constructors in the same time, instead 
of just the genius inline (now primary) constructors with a body. ;)

My intention is not to demotivate you, fwiw. Keen to talk about the 
complexity.

--

Cheers
Nick
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.