短閉包,也叫作箭頭函數,是一種用 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
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 }
總而言之,短閉包是一個很受歡迎的特性,儘管有不少地方須要提升。其中最有可能就是多行閉包了.