This is an old revision of the document!
PHP RFC: Final anonymous classes
- Date: 2023-11-15
- Author: Daniil Gentili daniil@daniil.it
- Status: Under Discussion
Introduction
This RFC proposes to add support for final anonymous classes, or make all anonymous classes final by default, with or without the possibility to make them non-final.
Proposal
This RFC proposes to either add support for final anonymous classes, or make all anonymous classes final by default, with or without the possibility to make them non-final.
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).