array_map
或是
array_filter
函數時.
這就是它們看起來的樣子:php
// Post 對象的集合
$posts = [/* … */];
$ids = array_map(fn($post) => $post->id, $posts);
複製代碼
而之前,你必須這樣寫:bash
$ids = array_map(function ($post) {
return $post->id;
}, $posts);
複製代碼
咱們來總結一下短閉包函數如何使用.閉包
fn
關鍵字開頭return
關鍵字可忽略上面示例更嚴格的類型限定寫法可寫做:函數
$ids = array_map(fn(Post $post): int => $post->id, $posts);
複製代碼
有兩點須要說起:post
假如你想要經過引用的方式返回結果,應該使用如下語法:ui
fn&($x) => $x
複製代碼
簡而言之,除了只容許一個表達式之外,簡短的閉包和普通閉包的功能是同樣的。this
你應該正確的理解它:短閉包只能有一個表達式。這意味着閉包體中不能有多行。spa
緣由以下:短閉包的目的是爲了減小冗餘。固然,在任何狀況下, fn
都比 function
短。然而, RFC 的建立者 Nikita Popov 認爲,若是你要處理的是多行表達式的函數,那麼使用閉包得到的益處就更少了。code
畢竟,多行閉包的定義已經很冗餘了,因此,有和沒有這2個關鍵字( function
和 return
)將不會有太大區別。cdn
你是否贊成這個觀點取決於你本身。雖然我能夠在個人項目中想到不少單行閉包的場景,但也有不少多行閉包的狀況,從我的角度,我會喜歡這些狀況下的簡短語法。
不過仍是有但願的:將來可能會添加多行短閉包,但那也是一個單獨的 RFC 。
短閉包和普通閉包的另外一個顯著特徵是,短閉包不須要用 use
關鍵字就能訪問外部做用域的數據。
$modifier = 5;
array_map(fn($x) => $x * $modifier, $numbers);
複製代碼
須要注意的是,不能修改外部範圍中的變量。由於它屬於值傳遞而不是引用傳遞。這意味着你能夠改變短閉包內的 $modifier
變量,但它不會對外部做用域中的 $modifier
變量產生影響。
固然,有一個例外,那就是 $this
關鍵字,它的做用與普通閉包中的做用徹底相同:
array_map(fn($x) => $x * $this->modifier, $numbers);
複製代碼
我已經提到過的多行閉包仍然是未來的一個發展可能.另一個在我腦海中的想法就是在容許在類中使用短閉包,好比 getters
和 setters
函數.
class Post {
private $title;
fn getTitle() => $this->title;
}
複製代碼
總而言之,短閉包是一個很受歡迎的特性,儘管有不少地方須要提升.其中最有可能就是多行閉包了.