rfc:readonly_classes

This is an old revision of the document!


PHP RFC: Readonly classes

Introduction

PHP 8.1 added support for readonly properties via PHP RFC: Readonly properties 2.0. However, it's still not easy to declare (quasi-)immutable classes, especially if they contain many properties. Therefore, this RFC proposes to add support for readonly classes.

Proposal

The usage of the readonly modifier added by PHP RFC: Readonly properties 2.0 is extended to classes:

readonly class Test {
    public string $prop;
}

Doing so will implicitly mark all instance properties of a class as readonly. Furthermore, it will prevent the usage of dynamic properties.

readonly class Foo
{
    public int $bar;
 
    public function __construct() {
        $this->bar = 1;
    }
}
 
$foo = new Foo();
$foo->bar = 2;
// Fatal Error: Uncaught Error: Cannot modify readonly property Foo::$bar
 
$foo->baz = 1;
// Fatal Error: Uncaught Error: Cannot create dynamic property Foo::$baz

Restrictions

As neither untyped, nor static properties are covered by the Readonly properties RFC, readonly classes cannot declare them either:

readonly class Foo
{
    public $bar;
}
 
// Fatal error: Readonly property Foo::$bar must have type
readonly class Foo
{
    public static int $bar;
}
 
// Fatal error: Readonly class Foo cannot declare static properties

Inheritance

Similarly how overriding of readonly properties works, a readonly class can only extend a readonly parent:

class A {}
readonly class B extends A {} // valid
 
readonly class C {}
readonly class C extends B {} // valid

But both of the following are illegal:

readonly class A {}
class B extends A {}
// Fatal error: Non-readonly class B cannot extend readonly class A
class A {}
readonly class B extends A {}
// Fatal error: Readonly class B cannot extend non-readonly class A

Reflection

A ReflectionClass::isReadOnly() method is added, which reports whether a class is declared as read-only. Additionally, ReflectionClass::getModifiers() will also include the ReflectionClass::IS_READONLY flag.

Backward Incompatible Changes

None.

Vote

Add readonly classes as proposed?

rfc/readonly_classes.1650352177.txt.gz · Last modified: 2022/04/19 07:09 by kocsismate