2021年12月1日

PHP 7.4 新功能! PHP 也有好用的箭頭函式 Arrow Function 了

本篇為PHP系列

在 JavaScript 中有個好用的箭頭函式,用起來很簡短,但對於不懂的人來說,會覺得有點魔幻,覺得很神奇卻又不是那麼好理解,因此常常被前端工程師拿來炫技,那什麼是箭頭函式呢?

我們來看下面的 JavaScript 範例,我們有一個 array,想要把其中的每個值都變成兩倍,那可以使用 map 搭配匿名函式來這樣做:

let numbers = [1, 2, 3, 4];
let doubleNumbers = numbers.map(function(number) {
  return number * 2;
});

這樣我們的 doubleNumbers 就會是 [2, 4, 6, 8]

而上面這個範例,若改成使用箭頭函式的話,就會像這樣,變得比較簡潔:

let numbers = [1, 2, 3, 4];
let doubleNumbers = numbers.map((number) => number * 2);

這樣簡潔的特性,是箭頭函式深受喜好的原因之一,而這樣的箭頭函式在 PHP 也可以使用了。

 

PHP Arrow Functions - 箭頭函式

用法

PHP 在 7.4 版加入了 Arrow Functions 的功能,作為更簡潔的 Anonymous functions 匿名函式用法。

我們先來看傳統的 PHP 匿名函式如何使用,我們一樣把 array 中的每個值都變成兩倍:

$numbers = [1, 2, 3, 4];
$doubleNumbers = array_map(function($number) {
    return $number * 2;
}, $numbers);

這樣 $doubleNumbers 就是 [2, 4, 6, 8]

而上面這個範例,若改成使用 PHP 的箭頭函式的話,會變成這樣,看起來也是比較簡短:

$numbers = [1, 2, 3, 4];
$doubleNumbers = array_map(fn($number) => $number * 2, $numbers);

不需要 return ,也省略了 {} ,會直接回傳 => 的運算結果,也就是 $number * 2

而箭頭函式跟匿名函式相比,還有另一個最大的好處是,可以減少使用 use。什麼意思呢?

舉例來說,我們今天想要把倍數提取成一個變數,讓我隨時可以改變,使用匿名函式的話,就會像這樣:

$numbers = [1, 2, 3, 4];
$mutiple = 3;
array_map(function($number) use ($mutiple) {
    return $number * $mutiple;
}, $numbers);

還會需要額外設定使用 $mutiple,但 PHP 箭頭函式會自動代入 scope 外的變數,因此可以省掉 use

$numbers = [1, 2, 3, 4];
$mutiple = 3;
array_map(fn($number) => $number * $mutiple, $numbers);

可以省掉 use 對我來講是一個很大的誘因去使用箭頭函式。

我認為的小缺陷

其中有幾個我認為的小缺陷,一個是仍然需要透過 fn 關鍵字才可以使用箭頭函式,我會覺得有點多餘。

另外一個是,沒辦法寫多行,什麼意思呢?因為箭頭函式省略掉了{},但同時也不允許我們使用{},因此像下方的多行用法,目前是不被允許的,我覺得有點可惜,希望以後的版本可以有機會使用。

fn() => {
	$a = 1;
	$b = 2;
	return $a + $b;
}

 

更多PHP相關文章,請參考:PHP系列