Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFC: short and inner classes #17895

Draft
wants to merge 20 commits into
base: master
Choose a base branch
from

Conversation

withinboredom
Copy link
Contributor

@withinboredom withinboredom commented Feb 22, 2025

This PR implements a draft RFC I am working on: https://wiki.php.net/rfc/short-and-inner-classes

What it does:

  1. Short class syntax is literally just shuffling some AST around. It's pretty simple so I won't go into it here.

Future work:

  • I could be "clever" to remove the need for a specific ZEND_ACC_SHORT_SYNTAX, but it is the most straightforward solution -- however, this feature takes the last slot; which may not be ideal.
  1. Inner classes are a bit more complex.

Inner classes basically work by making some changes to the grammar to allow for inner classes to be defined and referenced -- both as a type and as an instance of that type. There is no supporting grammar for using them in extends (mostly because I couldn't work out a way to make it unambiguous).

From there, there are some supporting modifications during compilation where we do a bit of house keeping:

  • Store the name of the inner class inside the outer class const/prop tables. This is needed to assist with private/protected accesses and error messages.
  • Add a "required scope" if needed to prevent initialization outside of the required scope.

And finally, we do some things at runtime to properly resolve the inner class (such as autoloading the outer class).

Feel free to review this work in progress if you'd like. I'm familiar with the internals of PHP, but I am by no means an expert, so any suggestions are appreciated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant