我在前篇文章 [Day 25] 匿名函式 Anonymous functions,提到用來減輕命名的負擔,使得程式更加靈活和有彈性,本篇則是要介紹更加短小精幹的 箭頭函式 (Arrow Functions)。
fn
和一個單一表達式,不需要使用關鍵字 return
來返回值,從而精簡程式。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
前篇文章,有一 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 . '!');
從 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() 轉換
);
}
expr
改成 三元運算式 簡化 if else 的程式碼。下次在 Laravel 遇到看不懂的程式碼,說不定是 PHP 更新後的新功能,除了爬 Laravel 文件之外, PHP 文件也該爬爬。
1 [Day 25] 匿名函式 Anonymous functions
2 Laravel #Support Policy
3 PHP 文件 - #Arrow Functions
4 Laravel Mutator & Accessor / 修改取得圖片路徑的方式