rfc:namespaced_names_as_token

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
rfc:namespaced_names_as_token [2020/06/15 15:16] – created nikicrfc: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 <nikic@php.net>   * Author: Nikita Popov <nikic@php.net>
-  * Status: Draft+  * Status: Under Discussion
   * Target Version: PHP 8.0   * Target Version: PHP 8.0
   * Implementation: https://github.com/php/php-src/pull/5720   * Implementation: https://github.com/php/php-src/pull/5720
Line 8: Line 8:
 ===== Introduction ===== ===== Introduction =====
  
-PHP currently treats namespaced names like ''Foo\Bar'' as a sequence of identifier and namespace separator tokens. This RFC proposed to treat namespaced names as a single token, an as such allow reserved keywords to appear inside them. At the same time, it proposes to lift reserved keyword restrictions for class, function and constant declarations.+PHP currently treats namespaced names like ''Foo\Bar'' as a sequence of identifiers and namespace separator tokens. This RFC proposes to treat namespaced names as a single token, and as such allow reserved keywords to appear inside them. At the same time, it proposes to lift reserved keyword restrictions for class, function and constant declarations.
  
 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 ''fn'' keyword as part of arrow function support. This broke my [[https://github.com/nikic/iter|iter library]], because it was using ''fn'' as part of a namespace name. However, this breakage was entirely unnecessary! Here is a typical usage example: 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 ''fn'' keyword as part of arrow function support. This broke my [[https://github.com/nikic/iter|iter library]], because it was using ''fn'' as part of a namespace name. However, this breakage was entirely unnecessary! Here is a typical usage example:
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:  T_NAME_FULLY_QUALIFIED // After:  T_NAME_FULLY_QUALIFIED
-// Rule:   {LABEL}("\\"{LABEL})*+// Rule:   ("\\"{LABEL})+
  
 namespace\Foo; namespace\Foo;
Line 83: Line 85:
  
 <PHP> <PHP>
-// This is interpreted as T_LIST and cannot be used as an identifier:+// This is interpreted as T_LIST (i.e., as a reserved keyword):
 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);
 </PHP> </PHP>
 +
 +==== 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!
 </PHP> </PHP>
 +
 +This also extends to function-like language constructs:
 +
 +<PHP>
 +function print($arg) {}
 +
 +print($arg); // This is the normal "print" language construct.
 +\print($arg) // This calls the print() function defined above.
 +</PHP>
 +
 +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 ''token_get_all()'' will need to be adjusted to handle the new ''T_NAME_*'' tokens.
  
 ===== Vote ===== ===== Vote =====
rfc/namespaced_names_as_token.txt · Last modified: 2020/07/31 12:54 by nikic