Forum und email

switch

פקודת switch מקבילה לסידרה של פקודות IF באותו ביטוי. במקרים בהם נרצה להשוות את ערכו של משתנה מסויים (או ביטוי) לערכם של ערכים רבים ולבצע פעולות מסויימות המתאימות לערך מסויים של המשתנה. זהו בדיוק המצב בו נמצא שימוש לפקודת switch.

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

if ($i == 0) {
    print "i equals 0";
}
if ($i == 1) {
    print "i equals 1";
}
if ($i == 2) {
    print "i equals 2";
}

switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
}

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

switch ($i) {
    case 0:
        print "i equals 0";
    case 1:
        print "i equals 1";
    case 2:
        print "i equals 2";
}

בדוגמה זו, אם ערכו של $i שווה ל-0 ,תתבצע הרצה של כל פקודות ה-print ! אם ערכו שווה ל-1 תתבצע הרצה של שתי הפקודות האחרונות ואם ערכו יהיה שווה ל-2 תרוץ רק פקודת ה-print האחרונה ונקבל את התוצאה המתבקשת. כלומר, חשוב לזכור את פקודות ה-break (למרות שיתכן מצב בו נמנע להשתמש בפקודה זו בכוונה).

בפקודת switch הביטוי מוערך פעם אחת בלבד והתוצאה נבדקת מול ערכי פקודותcase. בפקודת elseif הביטוי מוערך פעם נוספת. אם יש לבצע תנאי מורכב יותר מבדיקה פשוטה של and או or לביטוי, מומלץ להשתמש ב-switch שיבצע את המלאכה במהירות גבוהה יותר מאשר מהירותם של רצף פקודות if ו-elseif.

רשימת הפקודות של משפט case יכולה להיות ריקה במידה ונרצה להמשיך להרצת משפט ה-case הבא.

switch ($i) {
    case 0:
    case 1:
    case 2:
        print "i is less than 3 but not negative";
        break;
    case 3:
        print "i is 3";
}

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

switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
    default:
        print "i is not equal to 0, 1 or 2";
}

הביטוי במשפט ה-case יכול להיות כל משתנה מסוג פשוט כמו מספר אינטגרלי (integer) או מספר ריאלי (float) או מחרוזת. אי אפשר להשתמש במערך אלא אם הוא מיוצג בסוג משתנה פשוט.

גם התחביר האלטרנטיבי נתמך, ראה בפרק תחביר אלטרנטיבי למבני-בקרה.

switch ($i):
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
    default:
        print "i is not equal to 0, 1 or 2";
endswitch;