match ($value) { ... } משווה ערך מול רשימת זרועות עם === מחמיר ומחזיר את התוצאה של הזרוע הראשונה שמתאימה. כמה ערכים יכולים לחלוק זרוע, default תופס את השאר, ואם שום דבר לא מתאים PHP זורקת UnhandledMatchError.
שימו לב לנקודה פסיק אחרי הסוגר המסולסל הסוגר: match הוא ביטוי, כמו 1 + 2, ולכן כל הקטע הוא פקודת הצבה אחת. כל זרוע היא values => result, מופרדות בפסיקים, ופסיק אחרי הזרוע האחרונה מותר.
כמה ערכים בזרוע אחת
רשמו את הערכים עם פסיקים. הזרוע מתאימה אם הנושא זהה (===) לאחד מהם.
החזרה של match ישירות מפונקציה, כמו כאן, היא הדרך הנפוצה ביותר להשתמש בו.
match מול switch
אותו מיפוי כתוב בשתי הדרכים, עם קלט אחד שמראה את ההבדל הגדול ביותר: ההשוואה. switch משתמש ב-==, ולכן המחרוזת "1" מתאימה ל-case 1. match משתמש ב-===, ולכן לא.
match | switch | |
|---|---|---|
| השוואה | === מחמיר | == רופף |
| תוצאה | מחזיר ערך | פקודה, לא מחזירה כלום |
| נפילה | אף פעם | כן, עד break |
| כמה ערכים | 1, 2 => | מוערמים case 1: case 2: |
| אין התאמה | זורק UnhandledMatchError | לא עושה כלום |
| גוף של ענף | ביטוי אחד | כל מספר של פקודות |
השתמשו ב-match כשאתם הופכים ערך אחד לערך אחר. השאירו את switch כשענף צריך כמה פקודות או כשהנפילה היא העיקר; בעמוד switch יש את שני המקרים.
UnhandledMatchError: כששום זרוע לא מתאימה
בלי זרוע default, ערך שלא מתאים לשום דבר הוא שגיאה, לא null שקט. זו תכונה: קוד סטטוס חדש או שגיאת הקלדה נכשלים ברעש במקום לחמוק.
PHP נעצרת עם PHP Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string. סביבת פיתוח (עם zend.exception_ignore_args כבוי) מציינת את הערך במקום זאת: Unhandled match case 'XL'. תקנו את זה על ידי הוספת default => 'other', או על ידי תפיסת השגיאה במקום שבו צפוי ערך לא מוכר:
match(true) לטווחים ולתנאים
match משווה את הנושא לכל זרוע, ולכן אם הנושא הוא true, כל זרוע יכולה להיות תנאי. התנאי הראשון שמחושב לבדיוק true מנצח.
שני פרטים בבלוק הזה. throw הוא ביטוי מאז PHP 8, ולכן הוא יכול להיות התוצאה של זרוע. וכיוון שההשוואה מחמירה, כל תנאי חייב להחזיר בוליאני אמיתי: זרוע כמו $name => ... אף פעם לא מתאימה ל-true גם כש-$name היא מחרוזת לא ריקה. רק הזרוע שמתאימה מחושבת, ולכן ה-throw רץ רק לגיל שלילי.
match עם enums
match ו-enums מתאימים זה לזה: בתוך מתודה של enum, match ($this) ממפה כל case לערך. ראו enums ב-PHP על ה-enums עצמם.
אין כאן default בכוונה. אם מישהו יוסיף case חמישי בהמשך, קריאה ל-color() עליו תזרוק שגיאה במקום להחזיר צבע שגוי.
כמה פקודות בזרוע אחת
זרוע מכילה ביטוי אחד, ולכן 'save' => { ...; ... } הוא לא PHP תקין. העבירו את העבודה לפונקציה וקראו לה מהזרוע. הפונקציות של הזרועות שלא מתאימות לא נקראות לעולם.
שנו את $format ל-'json' או ל-'xml' והריצו שוב.
שאלות נפוצות
מה ההבדל בין match ל-switch ב-PHP?
match משווה עם === מחמיר, מחזיר ערך, אף פעם לא נופל לזרוע הבאה, מקבל כמה ערכים מופרדים בפסיקים לכל זרוע, וזורק UnhandledMatchError כששום זרוע לא מתאימה. switch משווה עם == רופף, הוא פקודה שלא מחזירה כלום, נופל הלאה בלי break, ובשקט לא עושה כלום כששום case לא מתאים.
מה קורה כששום זרוע לא מתאימה בביטוי match של PHP?
PHP זורקת UnhandledMatchError. הוסיפו זרוע default => ... כדי לטפל בכל ערך אחר, או תפסו את השגיאה עם try { ... } catch (\UnhandledMatchError $e) { ... }.
איך משתמשים ב-match עם תנאים כמו גדול מ ב-PHP?
התאימו מול true: match (true) { $age < 13 => 'child', $age < 18 => 'teen', default => 'adult' }. כל זרוע היא תנאי, והראשונה שהיא בדיוק true מנצחת.
האם זרוע של match יכולה להריץ כמה פקודות ב-PHP?
לא, כל זרוע היא ביטוי יחיד. שימו את הפקודות בפונקציה או במתודה וקראו לה מהזרוע, למשל 'export' => exportCsv($rows).
באיזו גרסת PHP נוסף match?
PHP 8.0. ב-PHP 7 אותה לוגיקה דורשת משפט switch או חיפוש במערך כמו $labels[$status] ?? 'Unknown'.