PHP 7.4 新語法:箭頭函數

PHP
短閉包,也叫作箭頭函數,是一種用 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

  • 在 PHP 7.4 裏可用
  • 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個關鍵字( functionreturn )將不會有太大區別。

你是否贊成這個觀點取決於你本身。雖然我能夠在個人項目中想到不少單行閉包的場景,但也有不少多行閉包的狀況,從我的角度,我會喜歡這些狀況下的簡短語法。

不過仍是有但願的:將來可能會添加多行短閉包,但那也是一個單獨的 RFC 。

外部做用域的值

短閉包和普通閉包的另外一個顯著特徵是,短閉包不須要用 use 關鍵字就能訪問外部做用域的數據。

$modifier = 5;

array_map(fn($x) => $x * $modifier, $numbers);

須要注意的是,不能修改外部範圍中的變量。由於它屬於值傳遞而不是引用傳遞。這意味着你能夠改變短閉包內的 $modifier 變量,但它不會對外部做用域中的 $modifier 變量產生影響。

固然,有一個例外,那就是 $this 關鍵字,它的做用與普通閉包中的做用徹底相同:

array_map(fn($x) => $x * $this->modifier, $numbers);

發展前景

我已經提到過的多行閉包仍然是未來的一個發展可能.另一個在我腦海中的想法就是在容許在類中使用短閉包,好比 getterssetters 函數.

class Post {
    private $title;

    fn getTitle() => $this->title;
}

總而言之,短閉包是一個很受歡迎的特性,儘管有不少地方須要提升.其中最有可能就是多行閉包了.

文章轉自: https://learnku.com/php/t/28219

更多文章: https://learnku.com/php/c/tra...
相關文章
相關標籤/搜索