比較 PHP 8 的 match 與 switch 語句

PHP 8 導入了全新的 match 表達式,提供了一種比 switch 更加簡潔和強大的多條件分支處理方式,對於許多資深 PHP 設計師來說也是個全新的東西,match 的優點很多,可以算是 switch 的改良版,以下是 match 與 switch 的詳細比較:

語法和結構

switch 語句:

switch ($value) {
    case 1:
        // 執行一些動作
        break;
    case 2:
        // 執行一些動作
        break;
    default:
        // 執行一些動作
        break;
}

match 表達式:

$result = match ($value) {
    1 => '一',
    2 => '二',
    default => '未知',
};

比較要點

  1. 簡潔性:

    • switch 結構較為冗長,尤其是在每個 case 區塊後需要使用 break 來避免執行後續的 case。
    • match 表達式則非常簡潔,每個條件直接對應結果,且不需要 break。
  2. 嚴格比較:

    • switch 使用寬鬆比較(==),這意味著不同類型但值相等的情況下會被視為相等。
    • match 使用嚴格比較(===),只有類型和值完全相等的情況才會匹配。
  3. 返回值:

    • switch 本身不返回值,它的結果通常需要透過變數賦值或輸出來實現。
    • match 是一個表達式,直接返回值,可以直接賦值給變數或作為函式的返回值。
  4. 代碼重用:

    • switch 中的每個 case 可以包含多行代碼,適合處理複雜的業務邏輯。
    • match 更適合簡單的條件映射,如果需要執行多行代碼,可以透過函式或方法來實現。

範例比較

switch 範例:

$value = 2;

switch ($value) {
    case 1:
        $result = '一';
        break;
    case 2:
        $result = '二';
        break;
    default:
        $result = '未知';
        break;
}

echo $result;

match 範例:

$value = 2;

$result = match ($value) {
    1 => '一',
    2 => '二',
    default => '未知',
};

echo $result;

錯誤處理

switch:

  • 如果忘記在 case 區塊後加上 break,會導致後續 case 區塊被執行(稱為「fall-through」),這通常是程式錯誤的來源。

match:

  • match 不需要 break,每個條件對應一個結果,不存在「fall-through」的風險。
  • 如果 match 表達式沒有覆蓋所有可能的情況且沒有 default 分支,將會引發錯誤,這有助於捕捉未處理的情況。

總結

  • 使用 switch:適合處理較為複雜的條件分支邏輯,特別是當每個 case 區塊需要執行多行代碼時。
  • 使用 match:適合簡單的值映射情況,語法簡潔,並且具備嚴格比較和返回值特性,使代碼更為清晰和可靠。

選擇使用哪一種語句應該根據具體的使用場景和需求來決定,在需要簡潔且明確的映射時,match 表達式通常是更好的選擇,而在需要處理複雜邏輯時,switch 仍然是一個有效的工具。

延伸閱讀

© Copyright wibibi.com 網頁設計教學百科 基礎的網頁設計規劃、資料庫與程式設計 Since 2012