rfc:arrow_functions_v2

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
rfc:arrow_functions_v2 [2019/03/14 08:58] – Cover more syntax nikicrfc:arrow_functions_v2 [2019/05/01 08:39] – Accepted nikic
Line 6: Line 6:
   * Target version: PHP 7.4   * Target version: PHP 7.4
   * Implementation: https://github.com/php/php-src/pull/3941   * Implementation: https://github.com/php/php-src/pull/3941
-  * Status: Under Discussion+  * Status: Accepted
  
 ===== Introduction ===== ===== Introduction =====
Line 90: Line 90:
 </PHP> </PHP>
  
-==== Static arrow functions ====+==== $this binding and static arrow functions ====
  
-For the sake of completenessstatic arrow functions are supported using the syntax +Just like normal closures, the ''$this'' variablethe scope and the LSB scope are automatically bound when short closure is created inside a class method. For normal closuresthis can be prevented by prefixing them with ''static''For the sake of completeness this is also supported for arrow functions:
-<php>static fn($x) => $x</php>. A static arrow functionjust like static closure, will not +
-bind the ''$this'' variable.+
  
-Static closures are mainly (exclusively?used to avoid unnecessary cycles involving ''$this'', +<PHP> 
-which may result in delayed GC.+class Test { 
 +    public function method() { 
 +        $fn = fn() => var_dump($this); 
 +        $fn(); // object(Test)#1 { ... } 
 +         
 +        $fn = static fn() => var_dump($this); 
 +        $fn(); // Error: Using $this when not in object context 
 +    } 
 +
 +</PHP> 
 + 
 +Static closures are rarely used: They're mainly used to prevent ''$this'' cycles, which make GC behavior less predictable. Most code need not concern itself with this. 
 + 
 +It has been suggested that we could use this opportunity to change the ''$this'' binding semantics towards only binding ''$this'' if it is actually used inside the closure. Apart from GC effects, this would result in the same behavior. Unfortunately PHP has some implicit uses of ''$this''. For example ''Foo::bar()'' calls may inherit ''$this'' if it is compatible with the ''Foo'' scope. We could only carry out a conservative analysis of potential ''$this'' use, which would be unpredictable from a user perspective. As such, we prefer to keep the existing behavior of always binding ''$this''.
  
 ==== By-value variable binding ==== ==== By-value variable binding ====
Line 248: Line 259:
 ===== Vote ===== ===== Vote =====
  
-Simple yes/no vote.+Voting started 2019-04-17 and ends 2019-05-01. A 2/3 majority is required. 
 + 
 +<doodle title="Add arrow functions as described in PHP 7.4?" auth="nikic" voteType="single" closed="true"> 
 +   * Yes 
 +   * No 
 +</doodle>
  
 ===== Discussion ===== ===== Discussion =====
Line 564: Line 580:
 <PHP> <PHP>
 $x = 1; $x = 1;
-$fn = () => $x++;+$fn = fn() => $x++;
 $fn(); $fn();
 var_dump($x); // By-value: 1 var_dump($x); // By-value: 1
Line 734: Line 750:
 ===== Changelog ===== ===== Changelog =====
  
 +  * 2019-03-14: Clarify $this binding and explain why we're sticking with always-bind behavior.
   * 2019-03-14: Mention ''%%->%%'', ''%%-->%%'', ''_()'' and ''\$x => $x''.   * 2019-03-14: Mention ''%%->%%'', ''%%-->%%'', ''_()'' and ''\$x => $x''.
rfc/arrow_functions_v2.txt · Last modified: 2020/08/01 23:53 by carusogabriel