Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is an implementation attempt of https://wiki.php.net/rfc/optional-interfaces
It's my first attempt at modifying PHP sources, so I am very open to any suggestions and guidance on how this should be actually solved. But for now I'll briefly explain my approach:
interface_name_list
andinterface_name
are added to parser.interface_name_list
is used instead ofclass_name_list
forimplements_list
andinterface_extends_list
. Theinterface_name
is a name that can be prefixed by a?
in which case it will set aZEND_CLASS_NAME_OPTIONAL
flag on theattr
of that token.zend_interface_name
is defined and used forinterface_names
. The difference fromzend_class_name
is that thezend_interface_name
also holds a booleanis_optional
which is set according to theZEND_CLASS_NAME_OPTIONAL
flag.ZEND_FETCH_CLASS_SILENT
flag onzend_fetch_class_by_name
if the interface nameis_optional
. In case an optional interface fails to fetch, it's just skipped.I'm not really sure what should be done for Opcache here and I haven't yet understood how to work with booleans there. I haven't looked into Reflection at all yet.