Currently, a class constant can be overridden in inheritors, but it's disallowed in interfaces.
// The following works: class A1 { const X = 1; } class B1 extends A1 { const X = 2; } // This doesn't: interface A2 { const X = 1; } interface B2 extends A2 { const X = 2; } // This doesn't work either: interface A3 { const X = 1; } class B3 implements A3 { const X = 2; }
Even if this restriction had a purpose, it's not really effective since it has only effect in direct inheritors:
// This works: interface A3 { const X = 1; } abstract class B3 implements A3 { } // Can't override here class B4 extends B3 { const X = 2; } // But can do here
This RFC proposes to normalize the behavior so that constant override is allowed everywhere. This is not an invite at reckless overriding but simply a matter of consistency. Class constants are constants only within the class they are defined in; child classes inherit them by default but the user can optionally override them if desired.
None.
7.3
If desired by the community, the 'final' keyword could be introduced in order to actually prevent constant override.
2/3 majority will be required.