Hey Tim,

On 30.06.26 04:27, Tim Düsterhus wrote:
Hi

Am 2026-06-29 22:06, schrieb Nick Sdot:
```

final readonly class Foo(Collection|array $value) implementsBar {
    $this->items = $value instanceof Collection ? $value : new Collection($value);
}=> {
    // class body private Collection $items

}

```

How is this not easy to reason about? How is this not *less* confusing?

By introducing `=> {` as a new syntactical pattern that we don't currently have and where we would need to figure out whether that pattern would be consistent with existing use of `=>`. My gut feeling is “it isn’t”.
I have literally zero strong opinion on how the syntax must look like; as mentioned in my very first answer to Rowan (discussion 1), this is meant to illustrate the concept and placement, not syntax.

I'm also noting that your example doesn't declare the `$items` property, which to me is an indicator that it actually isn't that easy to reason about.

It does declare it; for some reason it just slipped up behind the "class body" comment -- which is not the case in my sent mails.
“Reduce typing” alone is not a sufficiently strong argument in favor of a new feature.

Not sure how reduce typing is related to the argument I am making? My point is that I *want* primary constructors, but that they should allow bodies to have the same workarounds at hand to deal with readonly and hook issues as with conventional constructors.

The stated goal of the RFC (from the introduction) is: “removing […] boilerplate”. It specifically does so by allowing to omit `public function __construct`, `parent::__construct`, and a pair of braces. Personally I don't see much value in “just avoid typing some characters”. However for “logic-less” classes that just store some values, I can see where the proposal is coming from and the guarantee that the constructor actually is “logic-less” is some - small - benefit over “avoid typing characters that your IDE will autocomplete”.

This small benefit would entirely go away by allowing arbitrary logic in the constructor - and then as you said we would “[…] need to find an agreement on how parent constructor stuff works”, which is adding *extra* semantics that folks need to learn onto a feature that is supposed to make things *simpler*.

Quoting myself: "usage of parent constructor shortcut forbids manual parent constructor calling, and vice versa. Makes sense to me, and sounds easy to reason about."

Staying with your example above, but declaring `$items`, I've come up with the following:

    final readonly class Foo(Collection|array $value) implements Bar {
        $this->items = $value instanceof Collection ? $value : new Collection($value);
    } => {
        public Collection $items;

        // class body private Collection $items
    }

    final readonly class Foo implements Bar {
        public Collection $items;

        public function __construct(Collection|array $value) {
            $this->items = $value instanceof Collection ? $value : new Collection($value);
        }

        // class body private Collection $items
    }

I find the latter *much* clearer.

Great, then you are lucky, because you *can* write it that way. Now allow me too writing it how I want writing it and everyone is happy! <3
Best regards
Tim Düsterhus

--

Cheers
Nick

Reply via email to