短閉包,也叫作箭頭函數,是一種用 php 編寫的短函數.當向函數中傳遞閉包時,這個功能是很是有用的,好比使用 array_map
或是 array_filter
函數時.php
這就是它們看起來的樣子:閉包
// Post 對象的集合 $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts);
而之前,你必須這樣寫:函數
$ids = array_map(function ($post) { return $post->id; }, $posts);
咱們來總結一下短閉包函數如何使用.post
fn
關鍵字開頭return
關鍵字可忽略上面示例更嚴格的類型限定寫法可寫做:this
$ids = array_map(fn(Post $post): int => $post->id, $posts);
有兩點須要說起:spa
假如你想要經過引用的方式返回結果,應該使用如下語法:code
fn&($x) => $x
簡而言之,除了只容許一個表達式之外,簡短的閉包和普通閉包的功能是同樣的。對象
你應該正確的理解它:短閉包只能有一個表達式。這意味着閉包體中不能有多行。作用域
緣由以下:短閉包的目的是爲了減小冗餘。固然,在任何狀況下, fn
都比 function
短。然而, RFC 的建立者 Nikita Popov 認爲,若是你要處理的是多行表達式的函數,那麼使用閉包得到的益處就更少了。rem
畢竟,多行閉包的定義已經很冗餘了,因此,有和沒有這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
函數.
class Post { private $title; fn getTitle() => $this->title; }
總而言之,短閉包是一個很受歡迎的特性,儘管有不少地方須要提升.其中最有可能就是多行閉包了.
文章轉自: https://learnku.com/php/t/28219
更多文章: https://learnku.com/php/c/tra...