This is an old revision of the document!
PHP RFC: Final anonymous classes
- Date: 2023-11-15
- Author: Daniil Gentili daniil@daniil.it
- Status: Voting
Introduction
This RFC proposes to add support for final anonymous classes.
Proposal
This RFC proposes to add support for final anonymous classes.
This should also allow some additional opcache optimizations, such as any JIT logic gated behind a check on ZEND_ACC_FINAL, i.e. https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_trace.c#L4507.
Backward Incompatible Changes
None.
Proposed PHP Version(s)
Next PHP 8.4
RFC Impact
See Backward Incompatible Changes.
Proposed Voting Choices
2/3 required to accept.
Patches and Tests
Final anonymous classes implementation: https://github.com/php/php-src/pull/11126
References
- Pull request discussion: https://github.com/php/php-src/pull/11126
- Internals discussion: https://externals.io/message/121356
Rejected Features
Personally, I would have instead preferred the much cleaner approach of making all anonymous classes final by default, (preferrably) without offering the option to make them non-final.
However, I understand that this might be a little bit too restrictive for something that may have some valid usecases, even if extending anonymous classes currently requires some hack-ish workarounds with class_alias.
Thus, this RFC initially included three mutually exclusive proposals:
- Add support for final anonymous classes (
new final class {}
syntax, no breaking changes) - OR Make all anonymous classes final by default, without the option to make them final (breaking change)
- OR Make all anonymous classes final by default, provide an optional
open
keyword to make them non-final (like in Kotlin,new open class {}
, breaking changes).
As an extra proposal related to the last two options, possibly requiring a separate RFC, in the last two cases, it might be a good idea to also disallow the use of class_alias
altogether for final anonymous classes (suggested by nikolas-grekas in https://github.com/php/php-src/pull/11126#issuecomment-1522042841).