rfc:final_properties

This is an old revision of the document!


PHP RFC: Final properties

Introduction

This RFC proposes to add support for a new property modifier that would allow properties to be initialized, but not modified afterwards. For example, Java and C# also have a similar - but not exactly the same - concept.

Proposal

“Final” properties in PHP (the actual keyword is to be decided) could be initialized either by an explicit default value, or by assigning a value to them. Unlike to final properties in Java, this RFC proposes to allow the initialization of object properties after object construction. The main purpose of this is to make lazy loading possible - which is an important aspect for many PHP applications. Additionally to object properties, class properties can also use the “final” modifier with the same restrictions.

As soon as initialization is done, any other attempt of assigning a new value to “final” properties would result in an exception:

class Foo
{
    final public int $a;
    final public string $b;
    final public array $c = [];
    final public stdclass $d;
 
    public function __construct()
    {
        $this->a = 1;
        $this->d = new stdclass();
    }
}
 
$foo = new Foo();
 
$foo->a = 2;                      // An exception is thrown as the property has been initialized in the constructor
$foo->b = "";                    // This assignment succeeds as it initializes property b
$foo->c = [];                     // An exception is thrown as property c has been initialized by a default value
$foo->c[] = "foo";            // An exception is thrown too
$foo->d->foo = "foo";     // This call succeeds as it's not an assignment to property d

As untyped properties have an implicit default value (null) in the absense of an explicit one, their usefulness would be very limited. In order to avoid the introduction or unintiutive workarounds, this RFC proposes to disable the “final” property modifier for them. Contrarily to untyped properties, typed properties are in uninitialized state by default, so they play well with the write-once semantics introduced by “final” properties. In order to be safe from problems with references, references on “final” properties are disabled as well.

Open questions

As there is no consensus about the name of the modifier, I'd like to put it to vote. You can find below the ideas that came up during discussion along with their pros/cons:

  • final: It would be a better fit for a modifier that prevents a property to be overridden (just like how it works for classes and methods)
  • immutable: Actually, this name is a lie because the usage of mutable data structures are not restricted (objects, resources)
  • readonly: This name can also lie (in case of lazy initialization) because the proposed modifier would actually work according to “write-once” semantics. The readonly modifier can be familiar for those who use C# though
  • writeonce: it's the most clear and most descriptive name among all, but it doesn't sound familiar at all
  • locked: it's a more abstract, less clear name for the feature, but at least it's not a lie
  • sealed: It has the same properties as locked, and this keyword is also used in C# (similarly to final in PHP)

That said, I'd like to propose “locked”, “sealed”, and “writeonce” as voting choices about the name of the feature.

Backward Incompatible Changes

There are no backward incompatible changes in this proposal except for the fact that “locked”, “sealed”, or “writeonce” would become a reserved keyword depending on the outcome of the secondary vote.

Future Scope

Adding support for “final” properties would lay the groundwork for immutable objects - for which I'm going to create a proposal if the current RFC is accepted.

Proposed Voting Choices

The primary vote (“Do you want to add support for the new property modifier?”) requires 2/3 majority, while the secondary one (“Which keyword to use”?) requires a simple majority.

References

Prior RFC proposing the introduction of immutable properties: https://wiki.php.net/rfc/immutability

rfc/final_properties.1582030691.txt.gz · Last modified: 2020/02/18 12:58 by kocsismate