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

參考連結:
PHP 8 都有哪些新功能,說說 PHP 8 的新增特性
SPATIE - Front Line PHP

sharkHead

PHP 與 Python 菜雞工程師,覺得前端有趣,但是無奈沒有慧根
目前沒有任何評論~