آموزش دستور switch در PHP + ترفندها و کاربردها

دستور switch در PHP یکی از دستورها و راه‌حل‌های خوب برای نوشتن روان‌تر و خواناتر برخی شرط‌هاست. در این آموزش علاوه بر یادگیری مفهوم این دستور، با چند مثال کاربردی، نحوه استفاده از آن در کدنویسی و ۷ ترفند جالب با آن را یاد می‌گیرید. اگر می‌خواهید با switch کار کنید یا مهارت‌های برنامه‌نویسی خودتان را افزایش دهید، این آموزش برای شماست!

دستور switch یکی از دستورهای ساده و در عین حال قدرتمند برای بررسی چندین شرط است. این دستور زمانی به‌کار می‌رود که بخواهید یک مقدار را با چند گزینه مقایسه کرده و بر اساس نتیجه، یک بلوک کد خاص را اجرا کنید.

برای مثال، فرض کنید در حال طراحی وب‌سایتی هستید که کاربران را بر اساس نقش‌های کاربری (مثلاً مدیر، نویسنده یا کاربر عادی) دسته‌بندی کرده و امکانات مختلفی به هر گروه ارائه می‌کند.

دستور switch چیست؟

ابتدا یک مثال خیلی ساده و پیشِ پا افتاده می‌زنم و در ادامه مثال‌های بیشتری را با هم بررسی می‌کنیم.

در سناریوی بررسی نقش‌های کاربری، اگر بخواهیم متناسب با هر نقش کاربری یک پیام خاص را چاپ کنیم، می‌بایست از چندین شرط استفاده کنیم.

یعنی به کمک ساختارهای شرطی if و elseif در PHP بررسی کنیم که اگر کاربرمان admin بود، فلان پیام چاپ شود، اگر editor بود فلان پیام و الی آخر.

<?php
 $role = "editor";
 
 if ($role == "admin"){
     echo "سلام مدیر جان!";
 } elseif ($role == "editor"){
     echo "نویسنده عزیز، وقتت بخیر!";
 } elseif ($role == "user"){
     echo "به سبز دانش خوش آمدید!";
 }

در چنین حالتی که دستور switch در PHP به کمکمان می‌آید! قطعه کد بالا را می‌توانم بدون هیچ تغییری در نتیجه، به‌صورت زیر بنویسم:

<?php
 $role = "editor";
 
 switch ($role){
     case "admin":
         echo "سلام مدیر جان!";
         break;
     case "editor":
         echo "نویسنده عزیز، وقتت بخیر!";
         break;
     case "user":
         echo "به سبز دانش خوش آمدید!";
         break;
 }

برای نوشتن ساده‌ترین حالت switch باید:

  • درون پرانتز دستور switch، نام متغیری را می‌گذاریم که می‌خواهیم مقدارش را با مقادیر مختلف مقایسه کنیم.
  • به ازای هر مقدار، کلمه کلیدی case نوشته و دقیقاً جلوی آن مقداری که می‌خواهیم متغیر با آن مقایسه شود را می‌نویسیم. این مقدار می‌تواند هر نوع داده‌ای در PHP باشد. دقت کنید در این دستور، برابر بودن مقادیر (==) بررسی می‌شود.
  • پس از نوشتن مقدار، علامت دو نقطه (:) گذاشته و سپس دستور یا دستورهایی که می‌خواهیم در هنگام برابر بودن متغیر با این مقدار اجرا شود را می‌نویسیم. در مثال بالا فقط یک echo نوشتم اما محدودیتی از نظر تعداد دستورها نداریم.
  • بعد از آخرین دستور (که این‌جا در هر حالت فقط یکی است) باید کلمه کلیدی break را بنویسیم. دلیلش را در بخش بعدی توضیح می‌دهم.
  • سایر caseها نیز به همین صورت نوشته می‌شوند.

دستور switch زمانی استفاده می‌شود که می‌خواهیم مقدار یک متغیر PHP را با مقادیر مختلف مقایسه کرده و متناسب با آن کار خاصی انجام دهیم. در کد بالا صرفاً یک پیام ساده را echo کرده‌ام؛ اما جلوتر کارهای متفاوتی انجام می‌دهیم.

۲ نکته مهم در کار با switch

ساختار switch باعث می‌شود کدهای ما خواناتر و مدیریتش آسان‌تر شود. البته دو نکته ظریف و بسیار مهم در کار با دستور switch در PHP وجود دارد که باید حتماً آن‌ها را متوجه شده و به‌درستی استفاده کنید.

در این بخش دو کلمه کلیدی break و default را در ساختار سوییچ PHP با مثال توضیح می‌دهم.

استفاده از break در switch

در قطعه کد بالا دیدید که در انتهای اسکوپ مربوط به هر case یک‌بار کلمه break را نوشتم. منظورم از اسکوپ PHP در این‌جا همان محدوده است که باید دستورها و کدهای هر case را بنویسیم.

آیا به خاطر دارید که از break در ساختار حلقه PHP چه زمانی استفاده می‌کردیم؟ زمانی که می‌خواستیم از حلقه خارج شویم از این عبارت کلیدی استفاده می‌کردیم.

در ساختار switch در PHP نیز باید مشخص کنیم که چه زمانی باید از دستور سوییچ خارج شویم. اگر کلمه break را ننویسم، سایر caseها نیز بررسی و اجرا می‌شوند.

در کد زیر می‌خواهم متناسب با روز هفته، وضعیت هفته را مشخص کنم. برای طولانی نشدن کدها، صرفاً ابتدا، وسط و انتهای هفته را می‌نویسم:

<?php
 $day = "Monday";
 
 switch ($day) {
     case "Saturday":
         echo "شروع هفته!";
     case "Monday":
         echo "وسط هفته!";
     case "Thursday":
         echo "آخر هفته!";
 }

وقتی مورد case "Monday" برقرار می‌شود تمام کدهای بعد از این خط تا پایان بخش switch اجرا می‌شود. بنابراین خروجی قطعه کد بالا چیزی شبیه زیر است:

وسط هفته!آخر هفته!

با این تعریف، احتمالاً متوجه شده باشید که چرا باید از break در محدودهٔ هر مورد استفاده کنیم. اصلاح‌شده‌ی کد بالا در زیر نوشته شده:

<?php
 $day = "Monday";
 
 switch ($day) {
     case "Saturday":
         echo "شروع هفته!";
         break;
     case "Monday":
         echo "وسط هفته!";
         break;
     case "Thursday":
         echo "آخر هفته!";
         break;
 }

کد بالا فقط «وسط هفته!» را چاپ می‌کند.

دقت کنید که می‌توانیم برای case آخر دستور break را ننویسیم! چرا؟ چون بعد از مورد آخر هیچ کد دیگری وجود ندارد و دستور switch به پایان می‌رسد. بنابراین گذاشتن break برای آخرین مورد اختیاری است.

کلمه default در دستور switch

وقتی که از ساختار شرطی استفاده می‌کنیم، گزاره else داریم. کدهای بلوک else هنگامی اجرا می‌شوند که هیچ کدام از شرط‌ها و مقایسه‌ها برقرار نیست.

با کلمه کلیدی default درون دستور switch در PHP می‌توانیم یک حالت پیش‌فرض تعریف کنیم که در صورت عدم تطابق متغیر با هیچ یک از موارد case، کدهای پیش‌فرض اجرا شوند.

در مثال نقش‌های کاربری، فرض کنید که به هر دلیلی، مقدار $role غیر از مدیر و نویسنده و کاربر باشد. با اضافه کردن بخش default می‌توانیم این وضعیت را مدیریت کنیم؛ چیزی شبیه به قطعه کد زیر:

<?php
 $role = "other";
 
 switch ($role){
     case "admin":
         echo "سلام مدیر جان!";
         break;
     case "editor":
         echo "نویسنده عزیز، وقتت بخیر!";
         break;
     case "user":
         echo "به سبز دانش خوش آمدید!";
         break;
     default:
         echo "خوش آمدید!";
         break;
 }

در کد بالا چون مقدار $role با هیچ‌یک از سه case موردنظرمان برابر نیست، کدهای پیش‌فرض اجرا می‌شوند. دقت کنید که اگر مقدار نقش کاربری مثلاً admin بود، فقط کدهای مربوط به همین case اجرا می‌شدند.

چرا از default در دستور سوییچ PHP استفاده کنیم؟

  1. مدیریت حالت‌های پیش‌بینی‌نشده: اگر کاربر یا برنامه مقادیری خارج از مواردی که برای caseها تعریف کرده‌ایم ارائه دهد، می‌توانیم مطمئن باشیم که روند کد به‌طور ایمن اجرا می‌شود.
  2. جلوگیری از خطاهای منطقی: اگر مثلاً درون بدنه caseها مثلاً مقدار یک متغیر را تعیین کنیم، درصورتی که default نداشته باشیم و هیچ caseـی برقرار نباشد، ممکن است مقدار متغیر موردنظرمان نامناسب یا اشتباه شود.
  3. افزایش اطمینان کد: وجود یک حالت پیش‌فرض و مشخص برای مقادیر ناشناخته، کدهای برنامه ما را قابل اعتمادتر می‌کند.

بخش default در switch زمانی اجرا می‌شود که مقدار متغیر با هیچ کدام از caseها برابر نباشد. به زبان ساده‌تر، اگر هیچ‌یک از caseها برقرار نباشند، case پیش‌فرض که با کلمه کلیدی default مشخص می‌شود برقرار خواهد شد. استفاده از این بخش برای مدیریت خطاها یا سناریوهای غیرمنتظره بسیار مفید است. معمولاً مورد default آخرین موردی است که در دستور switch نوشته می‌شود.

۴ ترفند کاربردی با switch در PHP

تا اینجا به مفهوم، نحوه تعریف و موارد استفاده از دستور سوییچ آشنا شدیم. به‌طور خلاصه، ساختار کد switch شبیه به قطعه کد زیر است. در این‌جا به‌جای چاپ یک مقدار، مقدار یک متغیر را تعیین کرده‌ام.

<?php
 /* PHP Switch statement */

 $city = "shiraz";
 $name = "";
 
 switch ($city){
     case "tehran":
         $name = "پایتخت کشور";
         break;
     case "shiraz":
         $name = "پایتخت فرهنگ و ادبیات ایران";
         break;
     case "mashhad":
         $name = "پایتخت معنوی ایران";
         break;
     default:
         $name = "یک شهر خوب";
 }

در این بخش ۴ ترفند کاربردی در کار با دستور switch در PHP می‌گویم که ممکن است در سناریوهای مختلف بتوانید از آن‌ها استفاده کنید.

چند case برای شبیه‌سازی OR

اگر بدنه‌ی چندتا از caseها یکسان است، می‌توانیم از آن‌ها به گونه‌ای استفاده کنیم که شبیه استفاده از اپراتور منطقی OR باشد.

مثال مربوط به روز هفته را به یاد بیاورید. می‌خواهیم آن را طوری بنویسیم که تمام روزهای هفته را شامل شده و حالت‌های اول هفته، میان هفته، پایان هفته و جمعه را چاپ کند.

راه‌حل اول این است که تمام روزها را نوشته و وضعیت متناسب با آن را چاپ کنم. یعنی چیزی شبیه به قطعه کد ناقص زیر:

<?php
 $day = "Monday";
 
 switch ($day) {
     case "Saturday":
         echo "اول هفته";
         break;
     case "Sunday":
         echo "میان هفته";
         break;
     case "Monday":
         echo "میان هفته";
         break;
     // سایر روزهای میان هفته
     case "Thursday":
         echo "آخر هفته";
         break;
     case "Friday":
         echo "جمعه";
         break;
 }

کد بالا خیلی طولانی است! از طریق برای تمام روزهای یک‌شنبه تا چهارشنبه یک کار کاملاً یکسان را انجام می‌دهیم. اگر یک ساختار شرطی ساده داشتیم، راه‌حل ساده‌تر کردن این شرط این بود که شرط‌های مربوط به میان هفته را با or بنویسیم؛ یعنی چیزی شبیه به:

if($day == "Sunday" or $day == "Monday" or $day == "Tuesday" or $day == "Wednesday"){
    echo "میان هفته";
}

معادل همین ساختار OR را می‌توانیم به‌صورت زیر با دستور switch در PHP بنویسیم:

<?php
 $day = "Monday";
 
 switch ($day) {
     case "Saturday":
         echo "اول هفته";
         break;
     case "Sunday":
     case "Monday":
     case "Tuesday":
     case "Wednesday":
         echo "میان هفته";
         break;
     case "Thursday":
         echo "آخر هفته";
         break;
     case "Friday":
         echo "جمعه";
         break;
 }

حالا هر کدام از caseهای میان هفته برقرار باشد، عبارت «میان هفته» چاپ خواهد شد.

ترکیب مقادیر عددی و رشته‌ای

گاهی اوقات ممکن است بخواهیم مقدار ورودی عدد توسط کاربر را بررسی کنیم. فرض کنید کاربر ممکن است برای عدد یک مقدار 1 یا one را وارد کند. همین‌طور برای سایر اعداد.

با الگوبرداری از ترفند قبلی، می‌توانیم کدی شبیه به زیر داشته باشیم:

<?php
 switch ($value){
     case 1:
     case "one":
         echo "مقدار برابر با یک است."
         break;
     case 2:
     case "two":
         echo "مقدار برابر با دو است."
         break;
     default:
         echo "مقدار عددی غیر از یک و دو است."
 }
آموزش اتصال و کار با دیتابیس در PHP

آموزش اتصال و کار با دیتابیس در PHP

مقایسه رشته‌ها با switch در PHP

وقتی از رشته متنی PHP درون ساختار شرطی یا سوییچ استفاده می‌کنیم، ممکن است بزرگ یا کوچکی حروف باعث شود شرط ما برقرار نباشد.

برای بررسی رشته‌ها بدون توجه به حروف بزرگ یا کوچک می‌توانید از تابع strtolower() کمک بگیرید.

<?php
 $command = "Start";

 switch (strtolower($command)){
     case "start":
         echo "برنامه شروع شد.";
         break;
     case "stop":
         echo "برنامه متوقف شد.";
         break;
     default:
         echo "دستور نامعتبر است.";
 }
آپلود فایل در PHP با کد و ۳+۲ ترفند دنیای واقعی

آپلود فایل در PHP با کد و ۳+۲ ترفند دنیای واقعی

نوشتن return در دستور switch

فرض کنید می‌خواهیم پیام مرتبط با هر نقش کاربری را به‌صورت یک تابع PHP بنویسیم. روشی که احتمالاً به ذهنتان می‌رسد این است که یک متغیر را متناسب با نقش کاربری مقداردهی کرده و در انتها return کنیم. مثل کد زیر:

<?php
 function get_role_message($role){ 
     $message = null;

     switch ($role){
         case "admin":
             $message = "سلام مدیر جان!";
             break;
         case "editor":
             $message = "نویسنده عزیز، وقتت بخیر!";
             break;
         case "user":
             $message = "به سبز دانش خوش آمدید!";
             break;
         default:
             $message = "خوش آمدید!";
             break;
     }
     return $message;
 }

اما می‌توانیم به‌جای مقداردهی متغیر، مستقیماً آن را return کنیم. توجه کنید که در چنین حالتی، چون با دستور return به‌طور کامل از تابع و قاعدتاً از دستور switch خارج می‌شویم، نیازی به نوشتن break نیست.

 function get_role_message($role){ 
     switch ($role){
         case "admin":
             return "سلام مدیر جان!";
         case "editor":
             return "نویسنده عزیز، وقتت بخیر!";
         case "user":
             return "به سبز دانش خوش آمدید!";
         default:
             return "خوش آمدید!";
     }
 }
آموزش کار با فرم در php و ساخت فرم

آموزش کار با فرم در php و ساخت فرم

خلاصه آموزش switch در PHP

دستور switch دستوری کارآمد برای مدیریت شرایط مختلف در کد است. این دستور خوانایی و سادگی کد را در بعضی موارد افزایش داده و جایگزین مناسبی برای ساختارهای شرطی باشد. اما دقت کنید که اگر بخواهید از شرط‌های پیچیده استفاده کنید، احتمالاً گزینه مناسبی نخواهد بود.

به یاد داشته باشید که باید از break برای جلوگیری از اجرای سایر بلوک‌ها درون هر بلوک استفاده کنید. همچنین خیلی خوب است که حالت پیش‌فرض را با بلوک default مشخص کنید. در صورت تمایل می‌توانید مستندات سوییچ را در سایت اصلی آن (+) بخوانید.

از نسخه 8.0 زبان PHP یک جایگزین پیشرفته‌تر برای سوییچ به‌نام match ارائه شد. جایگزین به این معنا که می‌توانیم از هر دو دستور در کدهایی که با نسخه‌های 8 به بعد هستند استفاده کنیم. در آموزشی جداگانه دستور match در PHP را آموزش داده‌ام که می‌توانید به آن مراجعه کنید.

اگر سؤال یا چالشی در استفاده از دستور switch در پی اچ پی دارید، از بخش دیدگاه‌ها مطرح کنید. اگر مایلید زبان PHP را از صفر و اصولی فرا بگیرید، دوره رایگان آموزش PHP را به شما پیشنهاد می‌کنم.