مسیر شما: سبز دانش » برنامه نویسی » PHP » ساختار match در PHP چیست؟ آموزش با مثال و تفاوت با switch
وقتی در برنامهنویسی یک مقدار مشخص داریم و باید طبق آن یکی از چند حاصل را انتخاب کنیم، معمولاً سراغ ساختارهایی مثل if و switch میرویم. در PHP ویرایش 8 یک ساختار نوین به نام match معرفی شد که برای همین موقعیتها کدی کوتاهتر و معمولاً خواناتر در اختیارمان میگذارد.
match در PHP برای انتخاب یک خروجی مطابق مقدار یک متغیر استفاده میشود و مقایسه را بهصورت strict (یعنی ===) انجام میدهد؛ نیازی به break ندارد و میتواند مستقیماً برآیند را برگرداند.
در این آموزش syntax و نحوه استفاده از match را تحلیل میکنیم. در ادامه تفاوت آن با switch و نکات کاربردی در کار با آن را مطرح میکنم.
فهرست محتوای آموزش
به زبان خیلی ساده، match یک مقدار را با چند گزینه مقایسه میکند و برآیند مربوط به موردی که با آن برابر است را برمیگرداند.
فرض کنید در یک سایت عرضهگاهی، میخواهیم وضعیت سفارش را نمایش دهیم. وضعیت سفارش در متغیر $status ذخیره شده و میتواند یکی از مقادیر زیر را داشته باشد:
یک روش اولیه برای نمایش وضعیت سفارش، استفاده از if و elseif (شرط در PHP) است. در نهایت، کدی شبیه به زیر داریم:
<?php
$status = 'pending';
if($status === 'success'){
$message = 'موفق';
} elseif($status === 'pending'){
$message = 'در انتظار';
} elseif($status === 'failed'){
$message = 'ناموفق';
}
echo $message;این کد دقیقاً درست است؛ اما وقتی چند مقدار مشخص داریم و برای هر کدام فقط یک برآیند میخواهیم، میتوانیم آن را با match خلاصهتر بنویسیم:
<?php
$status = 'pending';
$message = match ($status) {
'success' => 'موفق',
'pending' => 'در انتظار',
'failed' => 'ناموفق'
};
echo $message;در این مقاله، مقدار $status تحلیل میشود. چون مقدار آن pending است، عبارت سمت راست => مربوط به همین حالت انتخاب میشود و بهعنوان حاصلٔ match برمیگردد. این مقدار در $message ذخیره میشود. بنابراین پیام «در انتظار» در این متغیر قرار میگیرد.
match یک expression است؛ یعنی خودش یک مقدار تولید میکند. به همین دلیل میتوانیم خروجیٔ آن را داخل متغیر قرار دهیم یا حتی آن را مستقیماً return کنیم. (مثلاً هنگامی که از آن در بدنه تابع PHP استفاده میکنیم.)
syntax کلی آن به شکل زیر است:
$result = match ($value) {
condition1 => result1,
condition2 => result2,
condition3 => result3,
default => defaultResult
};اجزای اصلی این ساختار عبارتاند از:
در واقع هر خط از match را میتوانیم اینطور بخوانیم:
اگر مقدار ورودی با این مقدار برابر بود، این خروجی را برگردان.
به هر خط اصطلاحاً یک arm گفته میشود. اگر مایل بودید، میتوانید مستندات آن را از اینجا در سایت PHP ببینید.
match و switch در بعضی سناریوها میتوانند کار مشابهی انجام دهند. از نظر ظاهری و نوشتاری هم خیلی به یکدیگر شباهت دارند. هر دو برای زمانی استفاده میشوند که یک مقدار را با چند حالت مختلف مقایسه میکنیم. تفاوت اصلی در نحوه مقایسه و ساختار کدنویسی آنهاست.
همان مثال وضعیت سفارش را در نظر بگیرید. اگر بخواهیم وضعیت سفارش را با switch مشخص کنیم، کدی شبیه به زیر خواهیم داشت:
<?php
$status = 'pending';
$message = "";
switch ($status) {
case 'success':
$message = 'موفق';
break;
case 'pending':
$message = 'در انتظار';
break;
case 'failed':
$message = 'ناموفق';
break;
default:
$message = 'نامشخص';
}نسخه جدید match قطعه کد بالا خیلی کوتاهتر و بهشکل زیر است:
<?php
$status = 'pending';
$message = match ($status) {
'success' => 'موفق',
'pending' => 'در انتظار',
'failed' => 'ناموفق',
default => 'نامشخص',
};خروجیٔ هر دو کد مفصلاً یکسان خواهد بود.
البته دستور switch در PHP تفاوتهایی با match دارد. در جدول زیر شش تفاوت مهم و اصلی را با هم مرور میکنیم.
در switch مقادیر با == مقایسه میشوند در حالی که match از === (یا اصطلاحاً مقایسه strict) استفاده میکند. حالت دوم، علاوه بر مقدار، نوع (type) داده را نیز ارزیابی میکند. در بخش بعدی برایش مثال میزنم.
نکته: match جایگزین switch نیست! وقتی چند حالت مشخص داریم و از هر حالت فقط یک برآیند میخواهیم (یک دستور در هر case یا arm)، معمولاً match انتخابی تمیزتر و مناسبتری است؛ مخصوصاً اگر بخواهیم برآیند را درون یک متغیر قرار دهیم. اما اگر برای هر حالت لازم باشد که چند دستور مختلف اجرا کنیم و یک بلوک چندخطی داشته باشیم، switch انعطاف بیشتری دارد. پس هر کدام در جای خود میتوانند مفید و کاربردی باشند.
تا اینجای آموزش ساختار اصلی را دیدیم. چهار نکته مهم دربارهٔ match وجود دارد که بهتر است آنها را با هم مرور کنیم.
کمی قبلتر گفتم که از مهمترین تفاوتهای match با switch نوع مقایسه آنهاست. match از === استفاده میکند؛ یعنی هم مقدار و هم نوع داده باید یکسان و برابر باشند.
در قطعه کد زیر، مقدار $value یک رشته متنی حاوی عدد '1' است. درون match دو تا مقدار عدد و رشته گذاشتهایم:
<?php
$value = '1';
$result = match ($value) {
1 => 'عدد',
'1' => 'رشته'
};
echo $result; // رشتهبنابراین مقدار رشته در متغیر $result ذخیره میشود و در نهایت با echo چاپ میشود.
match باید تمام حالتهای ممکن را پوشش دهد. اگر هیچ گزینهای با مقدار ورودی برابر نباشد و default نیز تعریف نشده باشد، PHP خطای UnhandledMatchError ایجاد میکند.
در قطعه کد زیر، مقدار canceled را برای مقادیر $status در نظر نگرفتهایم. در حاصل، کد با خطا مواجه و برنامه متوقف میشود.
<?php
$status = 'canceled';
$result = match ($status) {
'success' => 'موفق',
'pending' => 'در انتظار',
'failed' => 'ناموفق',
};
// raised UnhandledMatchErrorبرای جلوگیری از بروز خطا در PHP توسط match، دو راهکار داریم.
راهکار اول این است که همیشه عبارت default را تعریف کنیم؛ مثل قطعه کد زیر:
<?php
$status = 'canceled';
$result = match ($status) {
'success' => 'موفق',
'pending' => 'در انتظار',
'failed' => 'ناموفق',
default => 'نامشخص',
};راهکار دوم این است که از ساختار مدیریت خطا در PHP (همان try-catch) استفاده کنیم. چیزی شبیه به زیر:
<?php
$status = 'canceled';
try {
$result = match ($status) {
'success' => 'موفق',
'pending' => 'در انتظار',
'failed' => 'ناموفق',
};
} catch ($e) {
$result = 'نامشخص';
}گاهی منطق برنامهٔ ما طوری است که چند مقدار مختلف باید دقیقاً یک حاصل یکسان داشته باشند. در match میتوانیم چند مقدار را با , (کاما) کنار یکدیگر قرار دهیم.
مثلاً اگر روزهای هفته را از 1 (شنبه) تا 7 (جمعه) در نظر بگیریم و بخواهیم روزهای کاری و تعطیل را مشخص کنیم، ساختار match زیر را خواهیم داشت:
<?php
$day = 6;
$day_type = match ($day) {
1, 2, 3, 4, 5 => 'روز کاری',
6, 7 => 'تعطیل'
};
echo $day_type; // تعطیلدر قطعه کد بالا، اگر مقدار $day برابر با یکی از اعداد یک تا پنج باشد، حاصل روز کاری و اگر شش یا هفت باشد برآیند تعطیل خواهد بود.
یک کاربرد جالب دیگر match در PHP این است که بهجای مقایسه مستقیم یک مقدار با چند گزینه، میتوانیم از match(true) برای مرور بازهها استفاده کنیم.
برای مثال، فرض کنید که متغیر $age مشخصکننده سن کاربر است. میخواهیم با مقایسه بازهٔ عددی این متغیر، مشخص کنیم که کاربر «کودک / نوجوان / بزرگسال» است.
به قطعه کد زیر توجه کنید:
<?php
$age = 16;
$result = match (true) {
$age < 13 => 'کودک',
$age < 18 => 'نوجوان',
default => 'بزرگسال'
};در این نوع استفاده از match، هر شرط یک مقدار bool تولید میکند. اولین شرطی که true شود، برآیند آن انتخاب خواهد شد. اگر با انواع داده آشنا نیستید، آموزش متغیر و انواع داده در PHP را ببینید.
در این آموزش با match بهعنوان روشی برای مقایسه یک مقدار با چند حالت و دریافت حاصل متناظر با حالتِ متناظر آشنا شدیم. این قابلیت از PHP نسخه جدید 8.0 به این زبان اضافه شده و شباهت زیادی به switch دارد. اما چند تفاوت اصلی با switch دارد؛ از جمله مقایسه strict با ===، نداشتن break، فرصت برگرداندن مستقیم برآیند و خطا دادن در صورتی که هیچ حالتی با مقدار ورودی مطابقت نداشته باشد.
وقتی چند حالت مشخص داریم و برای هر کدام یک برآیند مشخص میخواهیم، معمولاً match کد تمیزتر و خلاصهتری در اختیارمان میگذارد. برای مثال، نمایش وضعیت سفارش، نقش کاربر، نوع پرداخت یا چاپ badgeها در لیستی از دادهها از کاربردهای مناسب match هستند.
در عین حال، match جایگزین همهٔ کاربردهای switch نیست. اگر برای هر حالت نیاز به اجرای چند دستور مختلف داشته باشیم، معمولاً switch انتخاب مناسبتری خواهد بود.
پس در هنگام انتخاب بین این دو، یک سؤال ساده از خودتان بپرسید: آیا برای هر حالت فقط میخواهم یک خروجی بهدست بیاورم یا لازم است چند دستور اجرا کنم؟ اگر حالت اول است، match و در غیر این صورت switch را انتخاب کنید.
امیدوارم که از این آموزش استفادهٔ کاربردی داشته باشید. پیشنهاد میکنم همین الان مشابه مثال وضعیت سفارش، کدی برای خودتان بنویسید. آن را با ساختار شرط، switch و ساختار match پیادهسازی کنید و حالتهای مختلفش را تمرین کنید.
این آموزش برای همیشه بدون هزینهه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خریداری یه فنجون نوشیدنی بهمون انرژی بدید!
برچسب:
نویسنده: استخدام کار