سرفصل‌های آموزشی
آموزش PHP
آشنایی با دستور switch در زبان PHP

آشنایی با دستور switch در زبان PHP

پیش از این گفتیم که یکی از انواع ساختارهای شرطی در زبان‌های برنامه‌نویسی مختلف، دستور switch است که به نوعی می‌توان آن را جایگزین چندین دستور if elseif در نظر گرفت. به طور کلی، ساختار دستورات سوئیچ در زبان برنامه‌نویسی PHP به صورت زیر است:

<?php
switch (Value) {
    case First value:
        // Code to be executed if Value = First value
        break;
    case Second value:
        // Code to be executed if Value = Second value
        break;
    case Third value:
        // Code to be executed if Value = Third value
        break;
    default:
        // Code to be executed if Value is different from all cases
}

همان‌طور که از ساختار دستور سوئیچ مشخص است، متغیر یا شرطی را داخل پرانتزهای مرتبط با switch قرار داده سپس در چندین case مختلف می‌سنجیم ببینیم که آیا متغیر/شرط ما با کدام‌ یک از کیس‌ها برابری می‌کند و در نهایت اگر با هیچ‌کدام از کیس‌ها هم‌خوانی نداشت، دستورات داخل بلوک default اجرا خواهند شد. برای روشن‌تر شدن نحوهٔ استفاده از دستور سوئیچ، ابتدا مثالی با دستور if می‌آوریم:

<?php
$i = 2;
if ($i == 0) {
    echo "i equals 0";
} elseif ($i == 1) {
    echo "i equals 1";
} elseif ($i == 2) {
    echo "i equals 2";
} else {
  echo "none of them";
}

متغیری تعریف کرده‌ایم تحت عنوان i$ که مقدار اولیهٔ ۲ را هم برایش در نظر گرفته‌ایم. حال با یکسری دستورات if و elseif سنجیده‌ایم که مقدار این متغیر با کدام یک از شروط برابری می‌کند. اکنون می‌خواهیم دستورات شرطی فوق را با switch ریفکتور (بازنویسی) کنیم:

<?php
$i = 2;
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
      echo "none of them";
}

ابتدا اسکریپت فوق را در مرورگر اجرا کرده، سپس به تفسیر کدهای فوق خواهیم پرداخت:

i equals 2

ابتدا متغیری تعریف کرده‌ایم تحت عنوان i$ و مقدار پیش‌فرض ۲ را هم برایش در نظر گرفته‌ایم؛ سپس این متغیر را به عنوان پارامتر ورودی دستور switch در نظر گرفته‌ایم و از سه کیس مختلف برای چک کردن مقدار این متغیر استفاده کرده‌ایم.

در کیس اول، کلیدواژهٔ case را نوشته، یک فاصله قرار داده و شرط مد نظر را نوشته‌ایم و پس از شرط هم یک علامت : قرار داده‌ایم (لازم به ذکر است که در کیس اول، شرط برابر بودن مقدار متغیر i$ با عدد ۰ است).

    نکته

علامت : اصطلاحاً Colon (کالِن) و علامت ; اصطلاحاً Semicolon (سِمی‌کالِن) گفته می‌شود.

به خاطر داشته باشیم که پس از کلیدواژهٔ case، به جای علامت : می‌توان از علامت ; نیز استفاده کرد:

<?php
$i = 2;
switch ($i) {
    case 0;
        echo "i equals 0";
        break;
    case 1;
        echo "i equals 1";
        break;
    case 2;
        echo "i equals 2";
        break;
    default:
      echo "none of them";
}

پس از هر دستور case، بایستی دستوراتی که مد نظرمان هست را بنویسیم. مثلاً چنانچه مقدار متغیر i$ برابر با ۰ باشد، دستور داده‌ایم که با استفاده از echo استرینگ i equals 0 چاپ شود.

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

به همین منوال، مقادیر ۱ و ۲ را هم چک می‌کنیم تا در نهایت به دستور default می‌رسیم که کاربردی همچون دستور else در دستورات شرطی if دارد. به عبارت دیگر، چنانچه هیچ‌ کدام از کیس‌ها اصطلاحاً true نباشند، مفسر وارد این بلوک می‌شود (توجه داشته باشید که اگر هر تعداد case پس از default قرار گیرد، هرگز چک نخواهند شد).

پیش از این گفتیم که کاربرد دستور break در سوئیچ‌ها بسیار حائز اهمیت است. برای روشن‌تر شدن این مسئله، کدهای فوق را به صورت زیر تغییر می‌دهیم:

<?php
$i = 0;
switch ($i) {
    case 0:
        echo "i equals 0<br>";
        // break;
    case 1:
        echo "i equals 1<br>";
        // break;
    case 2:
        echo "i equals 2<br>";
        // break;
    default:
      echo "none of them";
}

همان‌طور که می‌بینیم، ابتدا مقدار پیش‌فرض متغیر i$ را برابر با ۰ قرار داده، سپس کلیهٔ دستورات break را کامنت کرده‌ایم (همچنین از تگ <br> برای خواناتر شدن خروجی در داخل استرینگ‌ها استفاده کرده‌ایم). حال اقدام به اجرای این اسکریپت می‌کنیم:

i equals 0
i equals 1
i equals 2
none of them

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

همچنین به خاطر داشته باشیم که به جای دستور break از معادلی همچون continue (که بیشتر در حلقه‌ها استفاده می‌شود) نیز می‌توان استفاده کرد؛ برای مثال:

<?php
$i = 0;
switch ($i) {
    case 0:
        echo "i equals 0";
        continue;
    case 1:
        echo "i equals 1";
        continue;
    case 2:
        echo "i equals 2";
        continue;
    default:
      echo "none of them";
}

خروجی دقیقاً شبیه به زمانی است که از دستور break استفاده کرده بودیم.

    به خاطر داشته باشید
در دستور سوئیچ، Condition (شرط) فقط یک‌ بار سنجیده می‌شود و نتیجهٔ آن با کیس‌های مختلف مقایسه می‌گردد اما در دستور elseif، شرط هر دفعه سنجیده می‌شود؛ لذا اگر شرط شما کمی پیچیده است و نیاز به منابع سروری دارد، دستور switch در مقایسه با if elseif سریع‌تر است.

نکته‌ای که در ارتباط با سوئیچ در زبان PHP وجود دارد این است که می‌توان مفهوم OR (یا) را نیز در این‌گونه دستورات شرطی پیاده‌سازی کرد:

<?php
$i = 1;
switch ($i) {
    case 0:
    case 1:
    case 2:
        echo "i equals 0 or 1 or 2";
        break;
    default:
      echo "i is less than 0 or greater than 2";
}

به عنوان خروجی اسکریپت فوق داریم:

i equals 0 or 1 or 2

در واقع، چنانچه کیسی را نوشته اما هیچ دستوری برای آن در نظر نگیریم تا در صورت true بودن شرط اجرا گردد، دستور نوشته شدهٔ آخر مبنا قرار داده خواهد شد.

به طور کلی در صورتی که شروط زیاد باشند، دولوپرهای PHP از دستور if استفاده می‌کنند اما اگر اصرار بر استفاده از دستور switch داشته باشید، به شکل زیر خواهید توانست این مدل را پیاده‌سازی کنید:

<?php
$i = 16;
switch ($i) {
    case ($i >= 0 && $i <= 10):
        echo "i is between 0 and 10";
        break;
    case ($i > 10 && $i <= 20):
        echo "i is between 11 and 20";
        break;
    case ($i > 20):
        echo "i is greater than 20";
        break;
    default:
      echo "none of them";
}

به عنوان خروجی داریم:

i is between 11 and 20

اگر هم بخواهیم استرینگ‌ها را در دستور سوئیچ مورد بررسی قرار دهیم، می‌توان به صورت زیر این کار را انجام داد:

<?php
$fruit = 'apple';
switch ($fruit) {
    case 'apple':
        echo "An apple a day, keeps the doctor away!";
        break;
    case 'banana':
        echo "Is kind of delicious.";
        break;
    case 'orange':
        echo "Smells good.";
        break;
    default:
        echo "None of them";
}

به عنوان خروجی داریم:

An apple a day, keeps the doctor away!

حال ببنیم اگر مقدار متغیر fruit$ را برابر با Apple (حرف اول به صورت بزرگ نوشته شده است) قرار دهیم، کدام کیس اجرا می‌شود:

<?php
$fruit = 'Apple';
switch ($fruit) {
    case 'apple':
        echo "An apple a day, keeps the doctor away!";
        break;
    case 'banana':
        echo "Is kind of delicious.";
        break;
    case 'orange':
        echo "Smells good.";
        break;
    default:
        echo "None of them";
}

به عنوان خروجی داریم:

None of them

در واقع، از آنجا که apple و Apple دو استرینگ متمایز هستند، کیس اول هرگز true نخواهد شد و دستور داخل default اجرا می‌گردد. برای رفع این مشکل می‌توان کدهای فوق را به صورت زیر ریفکتور کنیم:

<?php
$fruit = 'Apple';
switch (strtolower($fruit)) {
    case 'apple':
        echo "An apple a day, keeps the doctor away!";
        break;
    case 'banana':
        echo "Is kind of delicious.";
        break;
    case 'orange':
        echo "Smells good.";
        break;
    default:
        echo "None of them";
}

مجدد کدهای فوق را اجرا می‌کنیم:

An apple a day, keeps the doctor away!

می‌بینیم که کیس اول به درستی برابر با true شد. در حقیقت، کاری که فانکشن ()strtolower انجام می‌دهد این است که کلیهٔ حروف بزرگ پارامتر ورودی‌اش را به حروف کوچک تبدیل می‌کند (فانکشن دیگری داریم تحت عنوان ()strtoupper که دقیقاً عکس فانکشن ()strtolower عمل می‌کند؛ به عبارت دیگر، کلیهٔ حروف کوچک پارامتر ورودی‌اش را به حروف بزرگ تبدیل می‌کند).

online-support-icon