PHP 7.4将包括箭头函数(匿名函数的缩写)

对功能的缩写语法的投票已完成(51票赞成,8票反对)。


那是:


$result = array_filter($paths, function ($v) use ($names) { return in_array($v, $names); }); 

它变成了:


 $result = array_filter($paths, fn($v) => in_array($v, $names)); 

细节剪下


新语法为:


句法


 fn(_) => _ 

与常规功能一样,在箭头功能的签名中,可以指定类型,默认值等。


 fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; 

注意! 一个新的关键字fn ,这意味着向后不兼容!


其他(废弃的)语法思想


考虑的选项:


  //  ,        ($x) => $x * $y //   ,     ,     { ($x) => $x + $y } //     Hack;       ($x) ==> $x * $y // ,      ($x) -> $x * $y //      $x-- > $x*$y $x --> $x * $y //    Rust,    |$x| => $x * $y 

还有一些


结束变量


重要! 与以前的php版本不同,在以前的版本中,必须使用use运算符显式设置可锁定的变量,而arrow函数隐式地关闭了整个父级刻度。


以下是等效条目:


 $y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; }; 

$此变量与其他任何变量一样关闭。 如果这是不受欢迎的行为,则可以使用static关键字禁用它。


 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 } } 

箭头函数中的关闭变量按值发生(例如,与Go语言相反)。 即 在函数内部更改变量不会更改父作用域中的变量。


结论


代码变得更加紧凑,尽管虽然不如javascript和其他一些语言那么紧凑,但编写起来仍然会更加愉快:


 $result = Collection::from([1, 2]) ->map(fn($v) => $v * 2) ->reduce(fn($tmp, $v) => $tmp + $v, 0); echo $result; //6 

与某些其他语言不同,php中的箭头功能不支持多个由字符分隔的语句; ,因为这(根据RFC的作者)与速记语法的思想相矛盾。 也许将来会对此进行修订。


我们肯定会在Zinc Prod播客中详细讨论php中的箭头功能,因此请务必订阅。


RFC链接

Source: https://habr.com/ru/post/zh-CN450544/


All Articles