PHP 8 中的新特性 (一), match 語句

程式技術
sharkHead

PHP 8 新增了一個新的 expression (語句) match,本文會來介紹一下 match 語句如何使用。

在介紹 match 之前,首先要介紹 switchswitch 在很多程式語言裡面都有,當你需要用到很多的 ifelse 時,可以考慮使用 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'),
};

相較於 switchmatch 的語句精簡非常多。

PHP 8 還有新增很多其他的特性,有興趣的朋友可以查看下面的參考連結。

參考資料

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言