PHP 8 中的新特性 (一), match 語句
PHP 8 新增了一個新的 expression (語句) match
,本文會來介紹一下 match
語句如何使用。
在介紹 match
之前,首先要介紹 switch
,switch
在很多程式語言裡面都有,當你需要用到很多的 if
與 else
時,可以考慮使用 switch
代替增加可讀性。
首先先來一段簡易的 switch
語法的範例。
<?php
$httpStatusCode = 400;
switch ($httpStatusCode) {
// 如果 $httpStatusCode 等於 200 或 300
case 200:
case 300:
$messageFromWebsite = 'ok';
break;
// 如果 $httpStatusCode 等於 400
case 400:
$messageFromWebsite = 'not found';
break;
case 500:
$messageFromWebsite = 'server error';
break;
// 如果上面都不匹配
default:
$messageFromWebsite = 'unknown status code';
break;
}
// PHP_EOL 為換行符號
echo "網站狀態:" . PHP_EOL;
echo "{$messageFromWebsite}";
上述的簡易的 switch
程式碼,印出來的結果如下。
網站狀態:
not found
如果我們使用 PHP 8 的新語句 match
改寫 switch
那段程式碼,就會變成。
<?php
$httpStatusCode = 400;
$messageFromWebsite = match($httpStatusCode) {
200, 300 => 'ok',
400 => 'not found',
500 => 'server error',
default => 'unknown status code',
};
echo "網站狀態:" . PHP_EOL;
echo "{$messageFromWebsite}";
是不是精簡非常多呢?
需要注意的一點是,match 中比對的值不只數值要一樣,連類型也是要相同的。有點類似運算子中 ==
與 ===
的差別,所以當我們把 $httpStatusCode
這個變數的類型改成 string
時。
<?php
// 將 400 改成 '400'
$httpStatusCode = '400';
switch
的輸出結果會保持不變,但是 match
就會變成使用 default
的設定。
網站狀態:
unknown status code
運算子「==」與「===」都是用來比對兩個值是否相等。
差別在於「===」會在額外比對數值的類型。
1 == '1' 結果為 true。
1 === '1' 結果為 false。
在 match
的語句中,你也可以新增一個例外處理。
<?php
$httpStatusCode = 400;
$messageFromWebsite = match($httpStatusCode) {
200, 300 => 'ok',
400 => 'not found',
500 => 'server error',
default => throw new Exception('Unknown status code'),
};
相較於 switch
,match
的語句精簡非常多。
PHP 8 還有新增很多其他的特性,有興趣的朋友可以查看下面的參考連結。