Anophel-آنوفل match یا switch در PHP 8

match یا switch در PHP 8

انتشار:
1
0

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 به عنوان یک سه تایی قدرتمندتر نگاه می کنم.

نظرتون چیه؟

#match_php#switch_match#php
نظرات ارزشمند شما :
Loading...