在 PHP 中,fn 是 匿名函數(Arrow Function,箭頭函數) 的語法,從 PHP 7.4 開始引入。
fn 的基本用法
它是一種簡潔的匿名函數寫法,類似於傳統的 function (...),但更簡短,並且 自動繼承外部變量(不需要 use)。
傳統匿名函數 vs. fn 短閉包
// 傳統寫法(PHP 7.3 或更早)
$func = function ($x) use ($y) {
return $x + $y;
};
// PHP 7.4+ 匿名函數寫法
$func = fn($x) => $x + $y; // 自動繼承 $y,不需要 `use`程式碼解析
$body = $permissions->map(fn ($permission, $id) => $roles->map(
fn (array $role_data) => $role_data['permissions']->contains($id) ? ' ✔' : ' ·'
)->prepend($permission));上面的程式碼中,fn 是 PHP 7.4 引入的箭頭函式 (Arrow Functions) 語法。它是一種更簡潔的匿名函式寫法。
讓我們來分解一下這段程式碼,以便更好地理解 fn 的作用:
外部 map 函式:
$permissions->map(...):這表示你在對$permissions集合(或類似的物件)中的每個元素執行一個操作。fn ($permission, $id) => ...:這是一個箭頭函式。它接收兩個參數:$permission(代表當前處理的權限名稱或描述) 和$id(代表當前權限的 ID)。=>符號之後的部分是這個函式要回傳的值。
內部 map 函式:
$roles->map(...):這表示你在對$roles集合中的每個角色執行另一個操作。fn (array $role_data) => ...:這是另一個箭頭函式。它接收一個$role_data參數,這個參數預期是一個陣列,包含了角色的相關資料,其中應該包含一個permissions屬性。$role_data['permissions']->contains($id) ? ' ✔' : ' ·':這是這個內部箭頭函式的核心邏輯。它檢查當前角色的permissions集合是否包含外部函式傳入的$id。- 如果包含,則回傳
' ✔'(表示該角色擁有此權限)。 - 如果不包含,則回傳
' ·'(表示該角色沒有此權限)。
- 如果包含,則回傳
prepend($permission):
- 內部
map函式回傳的結果是一個新的集合(或陣列),它包含了每個角色對於當前權限的檢查結果 (' ✔'或' ·')。 ->prepend($permission):這個方法會在這個結果的最前面加上當前處理的$permission名稱。
fn (箭頭函式) 的主要特點
- 簡潔性: 它允許你在一行內定義函式,特別適合短小的、只包含一個表達式的匿名函式。
- 自動捕獲外部變數: 箭頭函式會自動從其父作用域繼承變數。這意味著你不需要像傳統匿名函式那樣使用
use關鍵字來導入外部變數(例如,在上面的例子中,內部fn可以直接使用外部fn的$id變數)。 - 單一表達式:
fn箭頭函式只能包含一個表達式,這個表達式的值就是函式的回傳值。
總結
因此,程式碼中的 fn 是用來定義匿名函式的簡潔語法。它使得這段程式碼能夠清晰地表示:對於每一個權限,它會遍歷所有角色,檢查該角色是否擁有這個權限,並最終生成一個包含權限名稱和每個角色對應狀態的格式化輸出。




