1. דף הבית
  2. קורסים אונליין
  3. קורס PHP אונליין
  4. משפטי תנאי switch, case ב-PHP

משפטי תנאי switch, case ב-PHP

בפרק זה נכיר את מבנה switch-case להתניה עם חלופות. נתחיל מהסבר בסיסי ונמשיך לשימוש מתקדם. נציג גם טיפים ודוגמאות נפוצות.
משפטי switch-case ב-PHP

הצהרות switch-case ב-PHP

מבנה switch-case ב-PHP מספק דרך יעילה וקריאה לביצוע בלוק קוד אחד ממספר חלופות המבוססות על ערך משתנה. מבנה זה מהווה תחליף לקריאות if-else רבות הבוחנות את אותו המשתנה, והופך את הקוד לקריא הרבה יותר.

תחביר:

switch (expression) {
    case value1:
        // Code to execute if expression == value1
        break;
    case value2:
        // Code to execute if expression == value2
        break;
    default:
        // Code to execute if no cases match
}

הביטוי expression מחושב פעם אחת. PHP בודקת את ערכו ומשווה לכל אחד מהערכים בכל case לפי הסדר שלהם מהראשון לאחרון, עד שנמצאת התאמה.

אם נמצאה התאמה בין ערך הביטוי expression לערך של case כלשהו, מורץ הקוד שמופיע אחריו, עד אשר מופיעה הפקודה break. כל עוד לא מופיעה הפקודה break, יורץ הקוד גם אם הוא כבר גלש ל-case אחר או לחלק של ה-default.

אם לא נמצאה התאמה בין ערך הביטוי expression לערך של אף case, מורץ הקוד שבחלק של ה-default.

 

דוגמה:

<?php
$day = "Tuesday";

switch ($day) {
    case "Monday":
        echo "Start of the work week!";
        break;
    case "Friday":
        echo "Almost the weekend!";
        break;
    case "Sunday":
        echo "Relax, it's Sunday!";
        break;
    default:
        echo "Just another day.";
}
?>

בדוגמה זו נבדק ערך המשתנה day. ערך המשתנה הוא Tuesday. הערך נבדק מול אפשרויות ה-case השונות: Monday, Friday, Sunday. כיוון שלא נמצאת התאמה, מורץ הקוד בחלק של ה-default ועל המסך יודפס Just another day.

דוגמה זו למעשה מהווה חלופה קריאה וברורה יותר למבנה הקלאסי של if-else הזה:

<?php
$day = "Tuesday";

if ($day == "Monday") {
    echo "Start of the work week!";
} elseif ($day == "Friday") {
    echo "Almost the weekend!";
} elseif ($day == "Sunday") {
    echo "Relax, it's Sunday!";
} else {
    echo "Just another day.";
}
?>

מבחינת מהירות ביצוע, פעמים רבות מבנה switch-case מהיר יותר מאשר מבנה if-else, במיוחד כאשר מדובר על ריבוי תנאים ומצבים שונים. הסיבה לכך היא אופן המימוש של מבנה switch-case באמצעות טבלאות קפיצה לביצוע.

החסרת הפקודה break

איחוד שורות case

ניתן לעשות שימוש בכמה שורות case שונות ברצף, במטרה לאפשר הפעלת קטע קוד זהה במקרה של מספר ערכים שונים. רעיון זה עובד בפועל, מכיוון שברגע שקיימת התאמה בין הביטוי ב-switch לערך של case מסויים, מורץ כל הקוד מאותו case עד שמגיעים לפקודת break, וכל עוד הפקודה break אינה מופיעה, מתבצעת גלישה לקטעי ה-case בהמשך.

דוגמה:

<?php
$grade = "B";

switch ($grade) {
    case "A":
    case "B":
    case "C":
        echo "You passed!";
        break;
    case "D":
    case "F":
        echo "You failed.";
        break;
    default:
        echo "Invalid grade.";
}
?>

בדוגמה זו, אם ערך המשתנה grade הוא A או B או C, תוצג למשתמש ההודעה You passed. באופן דומה, אם ערך המשתנה grade הוא D או F, תוצג למשתמש ההודעה You failed. בכל ערך אחר של המשתנה grade, תוצג למשתמש ההודעה Invalid grade.

נפילה בין חלקי case שונים

ניתן ליצור מצב בו case מסויים יפעיל קוד של case אחר ובנוסף עוד קטע קוד יחודי. עושים זאת על ידי החסרת הפקודה break. כאמור, כאשר מופעל קטע קוד של case מסויים, הוא רץ עד לפקודת break, גם אם מדובר בגלישה לקטעי case אחרים.

דוגמה:

<?php
$number = 2;

switch ($number) {
    case 1:
        echo "One ";
    case 2:
        echo "Two ";
    case 3:
        echo "Three";
        break;
    default:
        echo "Invalid number.";
}
?>

בדוגמה זו, אם ערך המשתנה number הוא 3, יוצג Three. כיוון שהערך של number שקבענו הוא 2, מוצג Two Three. אם הערך של number הוא 1, יוצג One Two Three.

שימוש בטווחי ערכים בהצהרות switch-case

שיטה נפוצה לבדיקת טווח ערכים באמצעות switch-case היא לשים true בערך הנבדק ב-switch, ובחלק ה-case להכניס את הטווחים השונים.

דוגמה:

<?php
$age = 25;

switch (true) {
    case ($age < 13):
        echo "You are a child.";
        break;
    case ($age < 20):
        echo "You are a teenager.";
        break;
    default:
        echo "You are an adult.";
}
?>

שיטה זו נמצאת פחות בשימוש מהמקרה הנפוץ יותר של בדיקת ערך ספציפי, כיוון שהיא פחות קריאה ופחות אינטואיטיבית, אבל כדאי להכיר אותה.

קינון הצהרות switch-case

ניתן לבצע קינון של מבנה switch-case, כלומר, לקבוע מבנה switch-case שבו הקוד של אחד או יותר מחלקי ה-case יכלול בעצמו מבנה switch-case נוסף.

דוגמה:

<?php
$category = "Fruit";
$item = "Apple";

switch ($category) {
    case "Fruit":
        switch ($item) {
            case "Apple":
                echo "It's an apple.";
                break;
            case "Banana":
                echo "It's a banana.";
                break;
        }
        break;
    default:
        echo "Unknown category.";
}
?>

לא תמיד מומלץ לקנן הצהרות switch-case, כיוון שהקוד שנוצר עלול להיות פחות קריא. לעיתים, מוטב לשקול החלפה של מבני ה-switch-case (החיצוני, הפנימי או שניהם) במבני if-else קלאסיים.

טעויות נפוצות בעבודה עם switch-case

עבודה עם מערכים ב-switch-case

לא קיימת תמיכה לעבודה עם מערכים.

דוגמה:

<?php
$data = [1, 2, 3];

switch ($data) {
    case [1, 2, 3]:
        echo "Array matched.";
        break;
    default:
        echo "Switch cannot match arrays.";
}
?>

בדוגמה זו אנו בודקים את ערכי המערך data. דוגמה זו כמובן לא אמיתית ולא תרוץ כמתוכנן, כיוון שלא ניתן לבדוק ערך של מערך ב-switch-case.

ביצוע המרה אוטומטית לערכים (coercion)

בתנאי if ניתן לבצע השוואה מסוג === אשר בודקת גם את הערך וגם את הטיפוס (לעומת השוואה מסוג == שבודקת את הערך בלבד). לעומת זאת, ב-switch לא קיימת בדיקת טיפוסים וההשוואה היא של ערכים בלבד.

דוגמה:

<?php
$value = "123";

switch ($value) {
    case 123: // Matches due to type coercion
        echo "Matched integer.";
        break;
    case "123":
        echo "Matched string.";
        break;
}
?>

בדוגמה זו, יופעל ה-case הראשון, כיוון שהמשתנה value שהוא מטיפוס מחרוזת עם הערך "123" עובר המרה אוטומטית (coercion) לטיפוס מספרי עם הערך 123.

החסרת פקודת break בטעות

החסרה של פקודת break מ-case כלשהו מביאה למצב שבו התאמה לערך של ה-case תריץ גם את הקוד של אותו ה-case וגם את הקוד של ה-case הבא, כיוון שכאשר מוחסרת פקודת break הקוד ממשיך לרוץ תוך גלישה לקטע ה-case הבא. לעיתים, החסרת פקודת ה-break נעשית במכוון והדבר רצוי, אך לעיתים רבות הדבר נעשה בטעות ונוצר באג בקוד.

דוגמה:

<?php
$fruit = "apple";

switch ($fruit) {
    case "apple":
        echo "Apples are red or green.";
        // Missing 'break'
    case "banana":
        echo " Bananas are yellow.";
        break;
    case "cherry":
        echo " Cherries are red.";
        break;
    default:
        echo " Unknown fruit.";
}
?>

בדוגמה זו, החסרנו את פקודת ה-break בחלק של ה-case הראשון. לכן, כאשר ערך המשתנה fruit הוא apple יוצגו על המסך 2 שורות: השורה Apples are red or green (שורה זו רצויה) והשורה Bananas are yellow (שורה זו אינה רצויה והיא רצה שלא במתכוון).

הוספת תגובה
אנו משתמשים בעוגיות על מנת לשפר את חווית המשתמש באתר. מדיניות הפרטיותאני מסכים