rfc:lexical-anon

Differences

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

Link to this comparison view

Next revision
Previous revision
rfc:lexical-anon [2016/04/19 13:11] – created krakjoerfc:lexical-anon [2017/09/22 13:28] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== PHP RFC: Lexical Scope Support for Anonymous Classes ====== ====== PHP RFC: Lexical Scope Support for Anonymous Classes ======
-  * Version: 0.1+  * Version: 0.2
   * Date: 2016-04-19   * Date: 2016-04-19
   * Author: krakjoe   * Author: krakjoe
-  * Status: Draft+  * Status: Under Discussion
   * First Published at: http://wiki.php.net/rfc/lexical-anon   * First Published at: http://wiki.php.net/rfc/lexical-anon
  
 ===== Introduction ===== ===== Introduction =====
-Anonymous classes are cumbersome to use because they lack support for lexical scope variables.+Anonymous classes are cumbersome to use because they lack support for lexical scope [use()].
  
 If the anonymous class has dependencies, they must be injected via the constructor, which is verbose, repetitive, and widens the margin for error considerably. If the anonymous class has dependencies, they must be injected via the constructor, which is verbose, repetitive, and widens the margin for error considerably.
Line 71: Line 71:
     private $glow;     private $glow;
 };  }; 
 +</code>
 +
 +===== Syntax Choices =====
 +
 +Placing the [use(...)] anywhere else in the class declaration seems to be confusing, the current position seems the obvious choice.
 +
 +It has been suggested that it would be better to have [use(...)] on each function declaration. This would lead to a lot of repetition, and fragmented code that is more difficult to reason about.
 +
 +Another suggestion made is to allow symbols inline, so that the following code is legal:
 +
 +<code php>
 +class {
 +    public $prop = $var;
 +}
 +</code>
 +
 +This has some appealing advantages, such as using expression to initialize properties. But it also raises huge inconsistencies, why should this:
 +
 +<code php>
 +class {
 +    public $prop = new Foo();
 +}
 +</code>
 +
 +Be allowed, while not allowing the same thing in normal classes.
 +
 +Additionally, the following code would also have to be legal:
 +
 +<code php>
 +class {
 +    public $prop = &$this->prop;
 +}
 +</code>
 +
 +This is almost literally backwards.
 +
 +If we are going to allow expressions for anonymous classes that we do not allow for normal classes, then it is better to leave that for another RFC.
 +
 +What we are doing is only importing symbols, we don't //need// to invent a new way to initialize them.
 +
 +The cognitive overhead of "anything use'd by the declaration is a member property" is almost nil.
 +
 +===== Error Conditions =====
 +
 +The same restrictions that apply to use() on function declarations apply:
 +
 +  * Must not be superglobal name
 +  * Must not be ''$this''
 +
 +The property reference must be well formed, and accessible in the lexical scope:
 +
 +<code php>
 +$object->property
 +</code>
 +
 +A property name cannot be used twice:
 +
 +<code php>use($prop, $prop)</code>
 +
 +and
 +
 +<code php>use($prop, $this->prop)</code>
 +
 +Will both raise compile time errors:
 +
 +<code>
 +Fatal error: Cannot use property name glow twice in /in/file on line 6
 </code> </code>
  
Line 94: Line 161:
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
-https://github.com/php/php-src/compare/master...krakjoe:lexical-anon+https://github.com/php/php-src/pull/1874
  
 ===== Implementation ===== ===== Implementation =====
rfc/lexical-anon.1461071481.txt.gz · Last modified: 2017/09/22 13:28 (external edit)