iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

箭頭函式 Arrow Functions

我在前篇文章 [Day 25] 匿名函式 Anonymous functions,提到用來減輕命名的負擔,使得程式更加靈活和有彈性,本篇則是要介紹更加短小精幹的 箭頭函式 (Arrow Functions)。

Arrow Functions 注意事項

  • Arrow Functions 功能是起於 PHP 7.4,根據 Laravel #Support Policy 所示,Laravel 9 以後可以全面使用
  • Both anonymous functions and arrow functions are implemented using the Closure class. -出至 PHP 文件 - #Arrow Functions
  • Arrow Functions 使用關鍵字 fn 和一個單一表達式,不需要使用關鍵字 return 來返回值,從而精簡程式。
  • Arrow Functions use the fn keyword and a single expression. fn (argument_list) => expr,如:
<?php
$a = 6;
$b = 3;
echo "\$a = $a and \$b = $b <br>";

echo "<br>";

// function
function sum($a, $b){
  return $a + $b;
}
echo "sum(\$a, \$b) = ".sum($a, $b)."<br>"; // sum($a, $b) = 9

// Anonymous functions
$sub = function($a, $b){
  return $a - $b;
};
echo "\$sub(\$a, \$b) = ".$sub($a, $b)."<br>"; // $sub($a, $b) = 3

// Arrow Functions
$add = fn($a, $b) => $a + $b;

echo "\$add(\$a, \$b) = ".$add($a, $b)."<br>"; // $add($a, $b) = 9

用 Arrow Functions 精簡 Anonymous Functions

前篇文章,有一 Anonymous Functions 範例如:

<?php
Route::get('/hello', function () {
    return 'Hello, Laravel!';
});

Route::get('/hello/{name}', function ($name) {
    return 'Hello, ' . $name . '!';
});

在此使用 Arrow Functions 精簡程式,如:

<?php
Route::get('/hello', fn() => 'Hello, Laravel!');

Route::get('/hello/{name}', fn($name) => 'Hello, ' . $name . '!');
  • Anonymous Functions 和 Arrow Functions 輸出結果都是相同的,若只有一行的陳述式,Arrow Functions 更簡潔

結語

從 Laravel 9 開始後,程式越寫越簡潔 (優雅),我有時候分不清楚是原生 PHP 或是 Laravel 獨特的程式寫法,例如 M 同學在 Laravel Mutator & Accessor / 修改取得圖片路徑的方式 一文中,講解 Laravel 9 Mutator & Accessor 作法:

<?php
protected function imagePath(): Attribute
{
    return Attribute::make(
		set: fn(string $value) => Storage::url($value),
    );
}

根據先前的 Named Arguments, Anonymous Functions, Late Static Bindings ..等文章介紹後,就知道:

  • set: 是一個 Named Arguments 表示
  • fn() => expr 是一個 Anonymous Functions 表示
  • ::make() 是一個 Late Static Bindings 表示

知道上述這些 PHP 的做法後,Laravel 9 Mutator & Accessor 顯得平易近人。
參觀過 M 同學的文章,這裡除了 set: 之外,還有一個 get: 用來拿取 Database 的資料並處理,如:

<?php
protected function imagePath(): Attribute
{
    return Attribute::make(
        get: fn(string $value) => 
            str_starts_with($value, 'http') ? $value : Storage::url($value),
		// 如果 image_path 欄位不是以 http 開頭的話,就讓值經過 Storage::url() 轉換
    );
}
  • 一樣的 Named Arguments 和 Anonymous Functions,只是 expr 改成 三元運算式 簡化 if else 的程式碼。

下次在 Laravel 遇到看不懂的程式碼,說不定是 PHP 更新後的新功能,除了爬 Laravel 文件之外, PHP 文件也該爬爬。


參考文章

1 [Day 25] 匿名函式 Anonymous functions
2 Laravel #Support Policy
3 PHP 文件 - #Arrow Functions
4 Laravel Mutator & Accessor / 修改取得圖片路徑的方式


上一篇
[Day 25] 匿名函式 Anonymous functions
下一篇
[Day 27] Call API use JWT in Laravel: 簡介 和 安裝
系列文
PHP 沿途的風景30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言