PHP 8 عبارت match
جدید را معرفی می کند که یک ویژگی قدرتمند که اغلب انتخاب بهتری برای استفاده از switch
خواهد بود.دقیقاً چه تفاوت هایی وجود دارد؟
بیایید با مقایسه این دو شروع کنیم. در اینجا یک نمونه switch
کلاسیک آورده شده است:
switch ($statusCode) {
case 200:
case 300:
$message = null;
break;
case 400:
$message = 'not found';
break;
case 500:
$message = 'server error';
break;
default:
$message = 'unknown status code';
break;
}
در اینجا معادل match
آن است:
$message = match ($statusCode) {
200, 300 => null,
400 => 'not found',
500 => 'server error',
default => 'unknown status code',
};
اول از همه، عبارت match
به طور قابل توجهی کوتاهتر می باشد:
- نیازی به break ندارد.
- می تواند با استفاده از کاما
,
شرط های مختلف را در یک خط ترکیب کنید. - یک مقدار را برمی گرداند، بنابراین شما فقط یک بار باید مقدار را تعیین کنید.
بدون اجبار نوع داده
match
به جای بررسی های فقط مقدار ، بررسی های نوع را انجام می دهد. این مانند استفاده از ===
به جای ==
است.
$statusCode = '200';
$message = match ($statusCode) {
200 => null,
default => 'unknown status code',
};
// $message = 'unknown status code'
مقادیر ناشناخته باعث ایجاد خطا می شوند
اگر فراموش کردید یک مقدار را بررسی کنید، و زمانی که default
مشخص نشده باشد، PHP یک استثنا UnhandledMatchError
ایجاد میکند. باز هم سختگیری بیشتر، اما از بی توجه شدن اشکالات ظریف جلوگیری می کند.
$statusCode = 400;
$message = match ($statusCode) {
200 => 'perfect',
};
// UnhandledMatchError
فعلا فقط عبارات تک خطی
شما فقط می توانید در یک خط بنویسید. بلوک ها احتمالاً در یک نقطه اضافه می شوند، اما هنوز مشخص نیست دقیقا چه زمانی.
ترکیب شرط ها
شما قبلا متوجه brake
شده اید؟ این همچنین به این معنی است که match
اجازه نمی دهد که شرط های بعدی اجرا شوند، مانند دو خط مورد ترکیبی در مثال اول switch
. از طرف دیگر، شما می توانید شرط ها را در همان خط، که با کاما از هم جدا شده اند، ترکیب کنید.
بنابراین شما از این نظر عملکردی مشابه switch
دارید، اما با کد کمتر، و راه های کمتری برای به مشکلی خوردن.
$message = match ($statusCode) {
200, 300, 301, 302 => 'combined expressions',
};
شرایط و عملکرد پیچیده
در طول بحث RFC، برخی افراد پترن زیر را به عنوان استدلالی بجای اضافه کردن match
پیشنهاد کردند:
$message = [
$this->matchesRegex($line) => 'match A',
$this->matchesOtherRegex($line) => 'match B',
][$line] ?? 'no match';
با این حال یک هشدار بزرگ وجود دارد: این تکنیک ابتدا تمام توابع regex را اجرا می کند و عملکرد را کاهش می دهد. یک استدلال خوب برای match
.
استثناها
در نهایت، به دلیل throw در PHP 8، در صورت تمایل، امکان این را دارید که مستقیم از به صورت زیر استفاده کنید.
$message = match ($statusCode) {
200 => null,
500 => throw new ServerError(),
default => 'unknown status code',
};
پترن match
این تکنیکی است که در سایر زبان های برنامه نویسی استفاده می شود تا match
پیچیده تر از مقادیر ساده را فراهم کند. آن را به عنوان regex
در نظر بگیرید، اما برای متغیرها به جای متن.
در حال حاضر پشتیبانی نمیشود، زیرا یک ویژگی کاملاً پیچیده است، اما Ilija Tovilo، نویسنده RFC، آن را به عنوان یک ویژگی احتمالی آینده ذکر کرده است. چیزی که باید مراقبش بود!
بنابراین، switch یا match کدام بهتر است؟
اگر بخواهم match
را در یک جمله خلاصه کنم، میتوانم بگویم که این سختگیرانهتر و مدرنتر از آن است و برادر switch
کوچک است.
جایی که switch
انعطاف بیشتری را ارائه می دهد، به خصوص با بلوک های کد چند خطی. با این حال، سختگیری عملگر match
جذاب است.
match
به عنوان یک switch
مدرن و مفیدتر مطرح شد. من به match
به عنوان یک سه تایی قدرتمندتر نگاه می کنم.
نظرتون چیه؟