[RFC] Readonly constructors

From: Date: Thu, 22 May 2025 15:01:17 +0000
Subject: [RFC] Readonly constructors
Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
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.


Thread (2 messages)

« previous php.internals (#127427) next »