====== PHP RFC - Consistent class-constant override ======
* Version: 0.0.1
* Date: 2018-04-11
* Author: Pedro Magalhães, WesNetmo
* Status: Under Discussion
* First Published at: https://wiki.php.net/rfc/allow-constant-override-consistently
===== Introduction =====
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
===== Proposal =====
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.
===== Backward Incompatible Changes =====
None.
===== Proposed PHP Version: =====
7.3
===== Future scope: =====
If desired by the community, the '''final''' keyword could be introduced in order to actually prevent constant override.
===== Voting =====
2/3 majority will be required.
===== References =====
- [[...........|Discussion on externals]]