diff --git a/language/functions.xml b/language/functions.xml index 7444a4059102..a5ff99d522a7 100644 --- a/language/functions.xml +++ b/language/functions.xml @@ -1737,6 +1737,170 @@ Warning: Cannot bind an instance to a static closure in %s on line %d + + Arrow Functions + + + Arrow functions were introduced in PHP 7.4 as a more concise syntax for + anonymous functions. + + + Both anonymous functions and arrow functions are implemented using the + Closure class. + + + + Arrow functions have the basic form + fn (argument_list) => expr. + + + + Arrow functions support the same features as + anonymous functions, + except that using variables from the parent scope is always automatic. + + + + When a variable used in the expression is defined in the parent scope + it will be implicitly captured by-value. + In the following example, the functions $fn1 and + $fn2 behave the same way. + + + + + Arrow functions capture variables by value automatically + + $x + $y; +// equivalent to using $y by value: +$fn2 = function ($x) use ($y) { + return $x + $y; +}; + +var_export($fn1(3)); +?> +]]> + + &example.outputs; + + + + + + + This also works if the arrow functions are nested: + + + + Arrow functions capture variables by value automatically, even when nested + + fn($y) => $x * $y + $z; +// Outputs 51 +var_export($fn(5)(10)); +?> +]]> + + + + + Similarly to anonymous functions, + the arrow function syntax allows arbitrary function signatures, + including parameter and return types, default values, variadics, + as well as by-reference passing and returning. + All of the following are valid examples of arrow functions: + + + + Examples of arrow functions + + $x; +static fn(): int => $x; +fn($x = 42) => $x; +fn(&$x) => $x; +fn&($x) => $x; +fn($x, ...$rest) => $rest; + +?> +]]> + + + + + Arrow functions use by-value variable binding. + This is roughly equivalent to performing a use($x) for every + variable $x used inside the arrow function. + A by-value binding means that it is not possible to modify any values + from the outer scope. + Anonymous functions + can be used instead for by-ref bindings. + + + + Values from the outer scope cannot be modified by arrow functions + + $x++; // Has no effect +$fn(); +var_export($x); // Outputs 1 + +?> +]]> + + + + + + &reftitle.changelog; + + + + + + &Version; + &Description; + + + + + 7.4.0 + + Arrow functions became available. + + + + + + + + + + &reftitle.notes; + + + It is possible to use func_num_args, + func_get_arg, and func_get_args + from within an arrow function. + + + +