Re: [RFC] Readonly constructors

From: Date: Thu, 22 May 2025 15:25:57 +0000
Subject: Re: [RFC] Readonly constructors
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-127428@lists.php.net to get a copy of this message
On Thu, May 22, 2025, at 17:01, Mihail Liahimov wrote: > In PHP 8.1 the class read-on syntax was added, which allows you to create classes that are > completely closed to changes. In addition, it allows you to write less boilerplate when declaring a > property in the constructor. > > Before 8.1: > > class A > { > public function __construct( > private readonly int $a, > private readonly int $b, > private readonly int $c, > ) { } > } > > After 8.1: > > readonly class A > { > public function __construct( > private int $a, > private int $b, > private int $c, > ) { } > } > > But there are also scenarios where, for some reason, not all properties need to be readonly. > For example, when we inherit from a non-readonly class or when our class has a state for some kind > of memoization. In this case, the class is not readonly, and as a result, you have to write an extra > boiler plate in the constructor. I would like to be able to declare many readon properties in the > constructor in a way similar to readon classes. > > I suggest adding the ability to declare a constructor as a readonly. In this case, all the > properties declared in it will be automatically readonly. > > class A extends NonReadonlyClass > { > public readonly function __construct( > private int $a, > private int $b, > private int $c, > ) { } > } > > Yes, it looks a bit strange, but maybe someone will have other suggestions. Perhaps there is a > more competent way to organize this idea. Hello Mihail, I feel like it is kinda that way on purpose? If you find yourself writing a constructor with a lot of parameters that are a mix or readonly properties, it feels like that is a code smell. Either you should consider decomposing the object into multiple single-purpose objects or rethink the architecture in some way. For example: > when our class has a state for some kind of memoization. For example, in this case, you'd wrap the memoization state inside a mutable object and then use that as a readonly property. — Rob

« previous php.internals (#127428) next »