האופרטור הטרנרי הוא if/else שנכנס בביטוי אחד: condition ? valueIfTrue : valueIfFalse. הוא מחזיר אחד משני הערכים, כך שאפשר להציב אותו במשתנה, להדפיס אותו עם echo או להעביר אותו לפונקציה.
שנו את $age ל-15 ואת $items ל-3 והריצו שוב. שימו לב לסוגריים סביב הטרנרי בשורה האחרונה: בלעדיהם ה-. היה מחבר קודם את המחרוזות והתוצאה לא הייתה מה שרציתם.
טרנרי בתבניות HTML
טרנרי הוא הדרך הרגילה לבחור מחלקת CSS, תווית או מאפיין בתוך תבנית. הבלוק הזה קורא את ?stock= מכתובת ה-URL: הריצו אותו, ואז לחצו על הקישורים בלשונית Page ואותו סקריפט ירוץ שוב עם ערך אחר.
<?= ... ?> הוא קיצור של <?php echo ... ?>, ושומר על תנאים של שורה אחת קריאים בתוך ה-markup.
הטרנרי המקוצר ?: (אופרטור אלביס)
השמיטו את החלק האמצעי ותקבלו $a ?: $b: הוא מחזיר את $a כש-$a אמיתי, ואחרת את $b. הוא שימושי לברירות מחדל כשגם מחרוזת ריקה או 0 צריכים ליפול לערך החלופי.
הערכים השקריים הם false, 0, 0.0, "", "0", [] ו-null. אם "0" הוא תשובה אמיתית בנתונים שלכם (שדה כמות, קוד PIN), הטרנרי המקוצר יזרוק אותו.
?: מול ??
הם נראים דומים אבל בודקים דברים שונים. ?: עובר לערך החלופי כשהצד השמאלי שקרי. ?? עובר לערך החלופי רק כשהצד השמאלי null או לא מוגדר, והוא לא מזהיר על משתנה או מפתח מערך חסרים.
השתמשו ב-?? כש"הערך אולי לא קיים" (נתוני בקשה, מערכי הגדרות, מפתחות אופציונליים). השתמשו ב-?: כש"הערך קיים אבל אולי ריק". עמוד אופרטור ה-null coalescing מסביר את ?? ואת ??= בפירוט.
טרנרי מקונן צריך סוגריים
PHP 7 קראה את a ? b : c ? d : e משמאל לימין, בניגוד כמעט לכל שפה אחרת, וזה נתן תוצאות שגויות. PHP 8 מסרבת לנחש:
<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2
הוסיפו סוגריים סביב הטרנרי הפנימי וזה עובד:
הטרנרי המקוצר הוא היוצא מן הכלל: $a ?: $b ?: $c מותר בלי סוגריים, כמו בדוגמת אלביס למעלה.
השתמשו ב-match(true) כשיש יותר משני ענפים
טרנרי מקונן עם שלוש או ארבע רמות קשה לקריאה גם עם סוגריים. match עם true כנושא בודקת תנאים מלמעלה למטה ומחזירה את הזרוע הראשונה שמתאימה:
השאירו את הטרנרי לשתי תוצאות בשורה אחת, ועברו ל-match או לשרשרת if/elseif ברגע שאתם צריכים תוצאה שלישית.
שאלות נפוצות
מה זה האופרטור הטרנרי ב-PHP?
צורה מקוצרת של if/else שמחזירה ערך: $label = $age >= 18 ? 'adult' : 'minor';. אם התנאי שלפני ? מתקיים, משתמשים בביטוי שאחרי ?, ואחרת בביטוי שאחרי :.
מה המשמעות של ?: ב-PHP?
$a ?: $b הוא הטרנרי המקוצר (נקרא גם אופרטור אלביס). הוא מחזיר את $a אם $a אמיתי, ואחרת את $b, ולכן '' ?: 'default' הוא 'default'. זה כמו $a ? $a : $b, אבל $a מחושב פעם אחת בלבד.
אפשר לקנן אופרטורים טרנריים ב-PHP?
רק עם סוגריים. מאז PHP 8, $a ? 'x' : $b ? 'y' : 'z' היא שגיאה קטלנית, אז כתבו $a ? 'x' : ($b ? 'y' : 'z'). ליותר משני ענפים, match(true) או שרשרת if/elseif קריאים יותר.
אפשר להשתמש בטרנרי בלי חלק ה-else?
לא, הטרנרי תמיד צריך את שני הענפים. בשביל "השתמש בערך הזה או בברירת מחדל" כתבו $x ?: 'default' או $x ?? 'default'; כדי לעשות משהו רק כשתנאי מתקיים, כתבו if רגיל או $condition && doSomething();.