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.
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