PHP 中的 fn & function

在 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 是用來定義匿名函式的簡潔語法。它使得這段程式碼能夠清晰地表示:對於每一個權限,它會遍歷所有角色,檢查該角色是否擁有這個權限,並最終生成一個包含權限名稱和每個角色對應狀態的格式化輸出。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


內容索引