rfc:namespaced_names_as_token
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:namespaced_names_as_token [2020/06/15 15:19] – nikic | rfc:namespaced_names_as_token [2020/06/16 08:48] – nikic | ||
---|---|---|---|
Line 2: | Line 2: | ||
* Date: 2020-06-15 | * Date: 2020-06-15 | ||
* Author: Nikita Popov < | * Author: Nikita Popov < | ||
- | * Status: | + | * Status: |
* Target Version: PHP 8.0 | * Target Version: PHP 8.0 | ||
* Implementation: | * Implementation: | ||
Line 8: | Line 8: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | PHP currently treats namespaced names like '' | + | PHP currently treats namespaced names like '' |
The motivation is to reduce the backwards compatibility impact of new reserved keyword additions in future versions of PHP. To give a specific example, PHP 7.4 added the '' | The motivation is to reduce the backwards compatibility impact of new reserved keyword additions in future versions of PHP. To give a specific example, PHP 7.4 added the '' | ||
Line 48: | Line 48: | ||
===== Proposal ===== | ===== Proposal ===== | ||
+ | |||
+ | ==== Changes to namespaced names ==== | ||
PHP distinguishes four kinds of namespaced names: | PHP distinguishes four kinds of namespaced names: | ||
Line 72: | Line 74: | ||
// Before: T_NS_SEPARATOR T_STRING | // Before: T_NS_SEPARATOR T_STRING | ||
// After: | // After: | ||
- | // Rule: {LABEL}(" | + | // Rule: |
namespace\Foo; | namespace\Foo; | ||
Line 83: | Line 85: | ||
<PHP> | <PHP> | ||
- | // This is interpreted as T_LIST | + | // This is interpreted as T_LIST |
List | List | ||
// All of the following are interpreted as legal namespaced names: | // All of the following are interpreted as legal namespaced names: | ||
Line 107: | Line 109: | ||
// This would have previously been interpreted as $foo = Foo\call($bar), | // This would have previously been interpreted as $foo = Foo\call($bar), | ||
// now it will result in a parser error. | // now it will result in a parser error. | ||
- | $foo = Foo | + | $foo = Foo // <- Missing semicolon |
\call($bar); | \call($bar); | ||
</ | </ | ||
+ | |||
+ | ==== Changes to reserved keywords limitations ==== | ||
In additional to the namespaced name changes, reserved keywords may now be used in a number of additional places: | In additional to the namespaced name changes, reserved keywords may now be used in a number of additional places: | ||
Line 130: | Line 134: | ||
new \List; // Ok! | new \List; // Ok! | ||
</ | </ | ||
+ | |||
+ | This also extends to function-like language constructs: | ||
+ | |||
+ | <PHP> | ||
+ | function print($arg) {} | ||
+ | |||
+ | print($arg); | ||
+ | \print($arg) // This calls the print() function defined above. | ||
+ | </ | ||
+ | |||
+ | To avoid confusion in this particular case, it would be possible to prevent defining function symbols that clash with function-like language constructs. | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 149: | Line 164: | ||
As such, the practical impact is very limited, and any issues are trivial to fix. On the other hand, this change will reduce the backwards-compatibility impact from any future keyword additions. | As such, the practical impact is very limited, and any issues are trivial to fix. On the other hand, this change will reduce the backwards-compatibility impact from any future keyword additions. | ||
+ | |||
+ | Additionally tooling based on '' | ||
===== Vote ===== | ===== Vote ===== |
rfc/namespaced_names_as_token.txt · Last modified: 2020/07/31 12:54 by nikic