Avoiding enum reserved keyword

php.internals

Nikita Popov

5 years ago
Hi internals, I'm a bit concerned about the addition of the "enum" reserved keyword as part of https://wiki.php.net/rfc/enumerations. The problem is that there are quite a few existing enum libraries (such as https://github.com/myclabs/php-enum) that define an Enum class. While the implementation of enums in PHP 8 obsoletes these libraries, it still constitutes a migration problem, especially for libraries supporting more than one PHP version. I don't believe that the keyword is strictly necessary: We can recognize enum declarations as T_STRING T_STRING, where the former is checked to be equal to "enum" by the parser. It so happens that this is syntactically unambiguous at this time. We may be forced to introduce the keyword at a later time, if it becomes ambiguous. Another possibility would be to recognize T_ENUM in the lexer, but only if it is followed by whitespace and an identifier. This would possibly be friendlier for tooling using token_get_all(). It would not permit comments in between the tokens though. Thoughts? Regards, Nikita

Larry Garfield

5 years ago
On Tue, Feb 23, 2021, at 5:21 AM, Nikita Popov wrote:
> Hi internals, > > I'm a bit concerned about the addition of the "enum" reserved keyword as > part of https://wiki.php.net/rfc/enumerations. The problem is that there > are quite a few existing enum libraries (such as > https://github.com/myclabs/php-enum) that define an Enum class. While the > implementation of enums in PHP 8 obsoletes these libraries, it still > constitutes a migration problem, especially for libraries supporting more > than one PHP version. > > I don't believe that the keyword is strictly necessary: We can recognize > enum declarations as T_STRING T_STRING, where the former is checked to be > equal to "enum" by the parser. It so happens that this is syntactically > unambiguous at this time. We may be forced to introduce the keyword at a > later time, if it becomes ambiguous. > > Another possibility would be to recognize T_ENUM in the lexer, but only if > it is followed by whitespace and an identifier. This would possibly be > friendlier for tooling using token_get_all(). It would not permit comments > in between the tokens though. > > Thoughts? > > Regards, > Nikita
If I understand correctly, neither of these proposals would change the user-facing syntax, right? Just the parser details? I'm fine with that as a transition plan. I think long-term it's better to have all keywords behave the same, but if we could use one of these alternates for now and then switch to a normal T_ENUM in 9.0 (thus not breaking a class named Enum until then) I'd be fine with that. I can't see a comment between "enum" and "Suit" being useful, so that's an acceptable tradeoff for me. --Larry Garfield

Matthew Brown

5 years ago
On Tue, 23 Feb 2021 at 06:21, Nikita Popov <nikita.ppv@gmail.com> wrote:
> Another possibility would be to recognize T_ENUM in the lexer, but only if > it is followed by whitespace and an identifier. This would possibly be > friendlier for tooling using token_get_all(). It would not permit comments > in between the tokens though. >
I like this option. I can't think anyone would want to write "enum /** some comment */ Foo {...}"

Ilija Tovilo

5 years ago
Hi Nikita
> Another possibility would be to recognize T_ENUM in the lexer, but only if > it is followed by whitespace and an identifier. This would possibly be > friendlier for tooling using token_get_all(). It would not permit comments > in between the tokens though.
Thanks for the suggestion. This approach seems to work well. https://github.com/php/php-src/pull/6489/commits/4da3f3cc38b2b99004f3dcb67fd850a4f9608006 Hopefully this will make migrating to PHP 8.1 a little easier. Ilija