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 還有新增很多其他的特性,有興趣的朋友可以查看下面的參考連結