PHP 7.4 新語法:箭頭函數

短閉包,也叫作箭頭函數,是一種用 php 編寫的短函數。當向函數中傳遞閉包時,這個功能是很是有用的,好比使用 array_map 或是 array_filter 函數時.php

譯者注:PHP7.4 計劃於今年末發佈,請見 Wiki:PHP 基礎信息:發行計劃閉包

這就是它們看起來的樣子:函數

1 // Post 對象的集合
2 $posts = [/**/];
3 
4 $ids = array_map(fn($post) => $post->id, $posts);
5 而之前,你必須這樣寫:
6 
7 $ids = array_map(function ($post) {
8     return $post->id;
9 }, $posts);

 

咱們來總結一下短閉包函數如何使用.post

  • 在 PHP 7.4 裏可用
  • 以 fn 關鍵字開頭
  • 只能包含 一個 表達式,即返回表達式
  • return 關鍵字可忽略
  • 參數和返回類型都可作類型暗示

上面示例更嚴格的類型限定寫法可寫做:this

$ids = array_map(fn(Post $post): int => $post->id, $posts);

 

有兩點須要說起:
  • 還容許使用擴展操做符
  • 容許引用,兩個參數均可以做爲返回值

假如你想要經過引用的方式返回結果,應該使用如下語法:spa

fn&($x) => $x

 

簡而言之,除了只容許一個表達式之外,簡短的閉包和普通閉包的功能是同樣的。code

 

單行

你應該正確的理解它:短閉包只能有一個表達式。這意味着閉包體中不能有多行。對象

緣由以下:短閉包的目的是爲了減小冗餘。固然,在任何狀況下, fn 都比 function 短。然而, RFC 的建立者 Nikita Popov 認爲,若是你要處理的是多行表達式的函數,那麼使用閉包得到的益處就更少了。blog

畢竟,多行閉包的定義已經很冗餘了,因此,有和沒有這 2 個關鍵字( function 和 return )將不會有太大區別。作用域

你是否贊成這個觀點取決於你本身。雖然我能夠在個人項目中想到不少單行閉包的場景,但也有不少多行閉包的狀況,從我的角度,我會喜歡這些狀況下的簡短語法。

不過仍是有但願的:將來可能會添加多行短閉包,但那也是一個單獨的 RFC 。

 

外部做用域的值

短閉包和普通閉包的另外一個顯著特徵是,短閉包不須要用 use 關鍵字就能訪問外部做用域的數據。

$modifier = 5;

array_map(fn($x) => $x * $modifier, $numbers);

 

須要注意的是,不能修改外部範圍中的變量。由於它屬於值傳遞而不是引用傳遞。這意味着你能夠改變短閉包內的 $modifier 變量,但它不會對外部做用域中的 $modifier 變量產生影響。

固然,有一個例外,那就是 $this 關鍵字,它的做用與普通閉包中的做用徹底相同:

array_map(fn($x) => $x * $this->modifier, $numbers);

 

 

發展前景

我已經提到過的多行閉包仍然是未來的一個發展可能。另一個在我腦海中的想法就是在容許在類中使用短閉包,好比 getters 和 setters 函數.

1 class Post {
2     private $title;
3 
4     fn getTitle() => $this->title;
5 }

 

總而言之,短閉包是一個很受歡迎的特性,儘管有不少地方須要提升。其中最有可能就是多行閉包了.

相關文章
相關標籤/搜索