Menu

משפט switch ב-PHP: case, break ונפילה

switch ($value) משווה ערך אחד מול רשימת תוויות case ומריץ את הקוד מההתאמה הראשונה ועד break. כולל כמה case לבלוק אחד, נפילה, default, switch(true), ולמה switch משתמש בהשוואה רופפת ==.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

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 מתאים לכל ערך שנחשב אמת. הקישו על התאים כדי להשוות בין שני האופרטורים.

switch משווה עם ==, match משווה עם ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

ההשלכה המעשית: מחרוזת קלט "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) עושה את אותו הדבר עם השוואה מחמירה ומחזיר ערך.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל