Hi Mike,

On 20/10/2019 01:39, Mike Schinkel wrote:
Not yet having experience working on PHP's parser I do not know how it is 
configured nor what about the design of PHP requires keywords unable to be used 
as constants, class names, function or method names. I know this is a tangent 
but that seems like a requirement designed to simplify the parser maybe, and 
not because of any logical requirement. So I assume whatever word was used for 
this would also have to be a reserved keyword?  Or not?


I don't know the full implications in the parser, but at the language level, any constant can technically appear where this keyword would. That is, the following is valid right now:

const fallthrough=null;
fallthrough;

It doesn't do anything, but it's valid because any expression on its own is a valid statement, and a constant on its own is a valid expression.


Interestingly, that actually makes a single keyword *more* appealing to me, because it means you can get *forwards* compatibility by writing this:

if ( PHP_VERSION < 80000 && ! defined('fallthrough') ) {
    define('fallthrough', null);
}
switch ( $x ) {
    case 1:
        stuff();
        fallthrough;
    case 2:
        moreStuff();
     break;
}


For this common case where the new keyword is just a no-op, you then have code that supports and works identically across a range of versions:

* On versions without the keyword, the constant expression is a no-op (and may even be optimised out by OpCache?) * On versions where the keyword is present but optional, the define is skipped, and the keyword is a no-op * On versions (or external tooling) where omitting the keyword is a warning, or even an error, the keyword indicates intent


Regards,

--
Rowan Tommins (né Collins)
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to