短閉包,也稱為箭頭函數,是在PHP中編寫短函數的一種方式。這種表示法在將閉包傳遞給array_map或array_filter等函數時非常有用。
它們是這樣的:
// A collection of Post objects $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts);
在此之前,你必須這樣寫:
$ids = array_map(function ($post) { return $post->id; }, $posts);
讓我們總結一下如何使用短閉包。
● 自PHP 7.4起可用
● 他們以fn關鍵字開頭
● 它們只能有一個表達式,即return語句
#●不允許return關鍵字
● 參數和回傳類型可以是類型提示
上面範例的更嚴格類型的寫方式可能是:
$ids = array_map(fn(Post $post): int => $post->id, $posts);
還有兩件事要提到:
● 允許使用擴充運算子
● 允許引用,兩個參數都可以作為回傳值
如果你想透過引用傳回一個值,應該使用以下語法:
fn&($x) => $x
簡而言之,除了只允許一個表達式之外,短閉包還具有與普通閉包相同的功能。
# 沒有多行
您沒看錯:短閉包只能有一個表達式。這意味著您不能包含多行。
理由如下:
簡短閉包的目標是減少冗長。 fn當然在所有情況下都比function短。然而,RFC的創建者Nikita Popov認為,如果您處理的是多行函數,那麼使用短閉包所獲得的好處就更少。
畢竟,按照定義,多行閉包已經更加冗長;因此能夠跳過兩個關鍵字(function和return)不會有太大的區別。
您是否同意這種觀點取決於您自己。儘管我可以在專案中想到許多單行閉包,但也有很多多行閉包,在這些情況下,我個人會錯過簡短的語法。
不過還是有希望的:將來有可能會增加多行短閉包,但這只是一個RFC。
#來自外部範圍的值
#短閉包和普通閉包之間的另一個顯著區別是,短閉包不需要use關鍵字能夠從外部範圍存取資料。
$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);
要注意的是,不允許修改外部作用域中的變數。值是受值約束的,而不是受引用約束的。這意味著您可以在短閉包中更改$modifier,儘管它不會影響外部作用域中的$modifier變數。
當然有一個例外是$this關鍵字,它的作用與普通的閉包完全相同:
array_map(fn($x) => $x * $this->modifier, $numbers);
#未來的可能性
#我已經提到了多行短閉包,這仍然是未來的可能性。
另一個想法是允許類別中的短閉包語法,例如getter和setter:
class Post { private $title; fn getTitle() => $this->title; }
總而言之,短閉包是一個受歡迎的特性,儘管仍有改進的空間。最大的一個可能是多行短閉包
翻譯:https://stitcher.io/blog/short-closures-in-php
以上是PHP 7.4中的箭頭函數(Arrow Functions)的詳細內容。更多資訊請關注PHP中文網其他相關文章!