摘要:原因如下短閉包的目的是為了減少冗余。然而,的創(chuàng)建者認為,如果你要處理的是多行表達式的函數(shù),那么使用閉包獲得的益處就更少了。這意味著你可以改變短閉包內(nèi)的變量,但它不會對外部作用域中的變量產(chǎn)生影響。
短閉包,也叫做箭頭函數(shù),是一種用 php 編寫的短函數(shù).當向函數(shù)中傳遞閉包時,這個功能是非常有用的,比如使用 array_map 或是 array_filter函數(shù)時.
這就是它們看起來的樣子:
// Post 對象的集合 $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts);
而以前,你必須這樣寫:
$ids = array_map(function ($post) { return $post->id; }, $posts);
我們來總結(jié)一下短閉包函數(shù)如何使用.
在 PHP 7.4 里可用
以 fn 關(guān)鍵字開頭
只能包含 一個 表達式, 即返回表達式
return 關(guān)鍵字可忽略
參數(shù)和返回類型均可做類型暗示
上面示例更嚴格的類型限定寫法可寫作:
$ids = array_map(fn(Post $post): int => $post->id, $posts);
有兩點需要提及:
還允許使用擴展操作符
允許引用,兩個參數(shù)都可以作為返回值
假如你想要通過引用的方式返回結(jié)果,應(yīng)該使用以下語法:
fn&($x) => $x
簡而言之,除了只允許一個表達式以外,簡短的閉包和普通閉包的功能是一樣的。
單行你應(yīng)該正確的理解它:短閉包只能有一個表達式。這意味著閉包體中不能有多行。
原因如下:短閉包的目的是為了減少冗余。當然,在任何情況下, fn 都比 function 短。然而, RFC 的創(chuàng)建者 Nikita Popov 認為,如果你要處理的是多行表達式的函數(shù),那么使用閉包獲得的益處就更少了。
畢竟,多行閉包的定義已經(jīng)很冗余了,所以,有和沒有這2個關(guān)鍵字( function 和 return )將不會有太大區(qū)別。
你是否同意這個觀點取決于你自己。雖然我可以在我的項目中想到很多單行閉包的場景,但也有很多多行閉包的情況,從個人角度,我會喜歡這些情況下的簡短語法。
不過還是有希望的:未來可能會添加多行短閉包,但那也是一個多帶帶的 RFC 。
外部作用域的值短閉包和普通閉包的另一個顯著特征是,短閉包不需要用 use 關(guān)鍵字就能訪問外部作用域的數(shù)據(jù)。
$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);
需要注意的是,不能修改外部范圍中的變量。因為它屬于值傳遞而不是引用傳遞。這意味著你可以改變短閉包內(nèi)的 $modifier 變量,但它不會對外部作用域中的 $modifier 變量產(chǎn)生影響。
當然,有一個例外,那就是 $this 關(guān)鍵字,它的作用與普通閉包中的作用完全相同:
array_map(fn($x) => $x * $this->modifier, $numbers);發(fā)展前景
我已經(jīng)提到過的多行閉包仍然是將來的一個發(fā)展可能.另外一個在我腦海中的想法就是在允許在類中使用短閉包,比如 getters 和 setters 函數(shù).
class Post { private $title; fn getTitle() => $this->title; }
總而言之,短閉包是一個很受歡迎的特性,盡管有很多地方需要提高.其中最有可能就是多行閉包了.
文章轉(zhuǎn)自:https://learnku.com/php/t/28219
更多文章:https://learnku.com/php/c/tra...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/31425.html
摘要:原文來源預(yù)計在年年末就會正式發(fā)布了,本文先來看看一下的新特性。預(yù)加載預(yù)加載的實現(xiàn)理論上是可以為帶來很大的性能提升的。最后,你需要注意的向后不兼容特性,可以通過此鏈接來查看詳細內(nèi)容 原文來源:https://geixue.com/blogs/chan... PHP 7.4 預(yù)計在 2019 年年末就會正式發(fā)布了,本文先來看看一下 PHP 7.4 的新特性。 1.預(yù)加載預(yù)加載的實現(xiàn)理論上是...
摘要:預(yù)加載在框架啟動時在內(nèi)存中加載文件,而且在后續(xù)請求中永久有效。缺點性能的提升會在其他方面花費很大的代價,每次預(yù)加載的文件發(fā)生改變時,框架需要重新啟動。 PHP 7.4 計劃在2019年11月21日發(fā)布,它主要新增了以下幾個特性: 短閉包函數(shù)(short closure) 預(yù)加載提交性能 屬性類型限定 Improved type variance(不會翻譯) 三元運算簡寫 數(shù)組展開運...
摘要:性能提升當然需要付出代價如果預(yù)加載文件的來源發(fā)生變化,則必須重新啟動服務(wù)器。應(yīng)該指出,這是一個復(fù)雜的主題。默認情況下不啟用由于不再維護,核心團隊決定使用刪除其默認安裝。將在錯誤情況下拋出異常。請注意,強制轉(zhuǎn)換不受影響。 新特性 預(yù)加載預(yù)加載是PHP核心的一個驚人的補充,可以帶來一些重大的性能改進。簡而言之:如果您今天使用的是框架,則必須在每次請求時加載和重新編譯其文件。 預(yù)加載允許服務(wù)...
摘要:擴展已經(jīng)通過,正式成為的捆綁擴展庫。第一步,從頭文件把主要的數(shù)據(jù)結(jié)構(gòu)和函數(shù)聲明復(fù)制出來目前不支持預(yù)處理器除了和,所以宏定義要自己展開。 FFI擴展已經(jīng)通過RFC,正式成為PHP 7.4的捆綁擴展庫(Bundled Extensions)。 什么是FFI FFI(Foreign Function Interface),即外部函數(shù)接口,是指在一種語言里調(diào)用另一種語言代碼的技術(shù)。PHP的FF...
閱讀 1447·2021-09-04 16:40
閱讀 3543·2021-07-28 00:13
閱讀 2969·2019-08-30 11:19
閱讀 2693·2019-08-29 12:29
閱讀 3240·2019-08-29 12:24
閱讀 1184·2019-08-26 13:28
閱讀 2472·2019-08-26 12:01
閱讀 3579·2019-08-26 11:35