switch ($value) משווה ערך אחד מול רשימת תוויות case ומריץ את הקוד שמתחת לתווית הראשונה שמתאימה. כל case מסתיים ב-break; default מטפל בכל מה שלא התאים לשום דבר.
הציבו ב-$day את 'fri', 'sun' או 'wed' והריצו שוב. ה-case של default לא צריך break כשהוא האחרון.
כמה case לבלוק אחד
כדי להריץ את אותו קוד לכמה ערכים, ערמו את תוויות ה-case בלי שום דבר ביניהן. תווית מתאימה ממשיכה אל הקוד שמתחתיה.
בניגוד ל-match, ל-switch אין תחביר פסיקים case 'jpg', 'jpeg':. תוויות מוערמות הן הדרך היחידה.
נפילה: מה קורה בלי break
break הוא מה שעוצר switch. בלעדיו, PHP מריצה את ה-case המתאים ואז ממשיכה אל כל case שמתחתיו, מתעלמת מהתוויות שלהם, עד שהיא פוגשת break או את הסוף.
כאן הנפילה מכוונת: כל תוכנית מקבלת את התכונות שלה ועוד את כל מה שיש בתוכניות הזולות יותר. כשאתם כותבים אותה בכוונה, הוסיפו הערה כמו // no break כדי שהקורא הבא לא "יתקן" אותה. כשלא התכוונתם, break חסר הוא אחד הבאגים הנפוצים ביותר ב-switch.
switch משתמש בהשוואה רופפת (==)
כל case נבדק עם ==, לא עם ===. מחרוזת מספרית מתאימה למספר, null מתאים ל-false ול-"", ו-true מתאים לכל ערך שנחשב אמת. הקישו על התאים כדי להשוות בין שני האופרטורים.
| $a == $b | 0 | 1 | "0" | "1" | "" | null | false | true | "a" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | |||||||||||
| 1 | |||||||||||
| "0" | |||||||||||
| "1" | |||||||||||
| "" | |||||||||||
| null | |||||||||||
| false | |||||||||||
| true | |||||||||||
| "a" | |||||||||||
| "10" | |||||||||||
| "1e1" |
ההשלכה המעשית: מחרוזת קלט "1" מטופס נוחתת ב-case 1: בלי שום המרה, ולעיתים קרובות זה מה שרוצים. אבל switch (true) עם מחרוזת לא ריקה, או null שפוגש case false:, יכולים לבחור case שלא ציפיתם לו.
שימו לב לשורה של null: היא אף פעם לא מגיעה ל-case false:, כי null == 0 כבר מתקיים ו-case 0: בא קודם. עם השוואה רופפת, סדר ה-case משנה את התוצאה. מאז PHP 8, 0 == "a" הוא false (ב-PHP 7 הוא היה true), כך שמחרוזת לא מספרית כבר לא מתאימה ל-case 0:. אם אתם צריכים ===, השתמשו בביטוי match, שמוסבר בסוף העמוד.
switch(true) לטווחים ולתנאים
תווית case יכולה להיות כל ביטוי. עם switch (true), כל case הוא תנאי, והראשון ששווה ל-true מנצח.
ודאו שכל case הוא בוליאני אמיתי. בגלל ההשוואה הרופפת, case $name: היה מתאים בכל פעם ש-$name הוא מחרוזת לא ריקה.
switch בתוך לולאה: break ו-continue
בתוך לולאה, break ב-switch יוצא רק מה-switch, לא מהלולאה. כדי לעצור את הלולאה, השתמשו ב-break 2. continue בתוך switch מתנהג כמו break, ו-PHP מזהירה בזמן הידור: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. כתבו continue 2 כדי לדלג לאיטרציה הבאה של הלולאה.
switch מול match
PHP 8 הוסיפה את match, שמכסה את רוב השימושים של switch בפחות קוד. היא משווה עם ===, מחזירה ערך, אף פעם לא נופלת הלאה, מאפשרת תנאים מופרדים בפסיקים, וזורקת UnhandledMatchError כששום דבר לא מתאים, כך ש-case שנשכח לא יכול לעבור בשקט.
השאירו את switch כש-case צריך כמה פקודות, או כשהנפילה היא העיקר, כמו בדוגמת התוכניות. למיפוי ערך לתוצאה, match קצרה ובטוחה יותר.
שאלות נפוצות
איך משתמשים בכמה case לבלוק אחד ב-switch של PHP?
ערמו את תוויות ה-case בלי קוד ביניהן: case 'sat': case 'sun': echo 'weekend'; break;. כל תווית נופלת אל הקוד המשותף. אין ב-PHP תחביר case 'sat', 'sun': ל-switch; צורת הפסיקים הזו שייכת ל-match.
האם switch ב-PHP משתמש בהשוואה מחמירה?
לא. switch משווה עם == רופף, ולכן case '1': מתאים למספר השלם 1 ו-case 0: מתאים ל-'0'. להשוואה מחמירה עם ===, השתמשו בביטוי match או ב-switch (true) עם === בתוך כל case.
מה קורה אם שוכחים break ב-switch של PHP?
הביצוע נופל הלאה: אחרי ה-case המתאים, PHP ממשיכה להריץ את הקוד של כל case שמתחתיו עד שהיא מגיעה ל-break, ל-return או לסוף ה-switch. לפעמים זה מכוון, אבל בדרך כלל זה באג.
האם switch ב-PHP יכול לבדוק טווחים כמו גדול מ?
כן, עם switch (true): כל case מכיל תנאי כמו case $score >= 90:, והראשון שמתקיים רץ. ביטוי match (true) עושה את אותו הדבר עם השוואה מחמירה ומחזיר ערך.