Menu

אופרטור ה-null coalescing ב-PHP: ?? ו-??=

אופרטור ה-null coalescing ב-PHP מחזיר את הצד השמאלי שלו אלא אם הוא null או לא מוגדר: $name = $_GET['name'] ?? 'Guest';. הוא אף פעם לא מזהיר על משתנה או מפתח מערך חסרים. למדו שרשראות ??, את ההצבה ??=, ?? מול ?:, ואת האופרטור nullsafe ?->.

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

?? מחזיר את הערך שמשמאלו אם הוא קיים ואינו null, ואחרת את הערך שמימינו: $name = $_GET['name'] ?? 'Guest';. בניגוד לקריאה ישירה של המפתח, הוא אף פעם לא מזהיר כשהמשתנה או מפתח המערך חסרים.

בהרצה הראשונה אין מחרוזת שאילתה, ולכן משתמשים בשתי ברירות המחדל. לחצו על קישור בלשונית Page והסקריפט ירוץ שוב כש-$_GET מלא. קריאה של $_GET["name"] בלי ?? בהרצה הראשונה הייתה מדפיסה Warning: Undefined array key "name" בהתקנת PHP רגילה. עוד על נתוני בקשה בעמוד GETו−_GET ו-_POST.

?? הוא בדיקת isset() מקוצרת

$a ?? $b פירושו בדיוק isset($a) ? $a : $b. הוא עובד על משתנים, על מפתחות מערך בכל עומק ועל מאפייני אובייקטים, והוא עוצר בחלק החסר הראשון בלי להתלונן.

הבדיקה זהה לזו ש-isset עושה, ולכן גם מפתח שקיים עם הערך null מקבל את ברירת המחדל.

שרשור ?? כדי לנסות כמה מקורות

?? הוא אסוציאטיבי מימין, ואפשר לשרשר כמה שרוצים. PHP מחזירה את האופרנד הראשון שמוגדר ואינו null.

??= מציב רק כשהערך null

$a ??= $b שומר את $b ב-$a רק כש-$a לא מוגדר או null. זו הדרך הקצרה ביותר להשלים ברירות מחדל, או לחשב משהו פעם אחת ולהשתמש בו שוב.

הצד הימני של ??= מחושב רק כשההצבה קורית, ולכן computing 4 מופיע פעם אחת.

?? מול ?: (טרנרי מקוצר)

?? בודק null. ?: בודק אמיתיות. עם ערכים כמו 0, "" ו-"0" הם נותנים תשובות שונות:

כמות של "0" היא קלט אמיתי: ?? שומר אותה, ?: מחליף אותה. ?: לבדו היה מזהיר על המפתח החסר, ולכן הבלוק עוטף אותו כ-($inputs[$key] ?? null) ?: .... עמוד האופרטור הטרנרי מסביר את ?: עצמו.

האופרטור nullsafe ?->

?-> הוא הגרסה של אותו רעיון לאובייקטים, ונוסף ב-PHP 8. אם האובייקט משמאל הוא null, כל השרשרת נעצרת ומחזירה null במקום לזרוק Error כמו Call to a member function getAddress() on null. הוסיפו ?? בסוף לקבלת ברירת מחדל.

משתמש 2 קיים אבל אין לו כתובת, ומשתמש 3 לא קיים בכלל. שניהם מגיעים לברירת המחדל ?? "unknown" בלי שגיאה.

טעות נפוצה: ל-?? יש קדימות נמוכה

?? נקשר חלש יותר מ-. ומאופרטורי החשבון. לכן ב-"Count: " . $count ?? 0, PHP בונה קודם את המחרוזת "Count: " . $count, שאף פעם אינה null, וברירת המחדל אף פעם לא נכנסת לפעולה.

עטפו את ביטוי ה-?? בסוגריים בכל פעם שהוא נמצא בתוך ביטוי גדול יותר.

שאלות נפוצות

מה המשמעות של ?? ב-PHP?

?? הוא אופרטור ה-null coalescing. $a ?? $b מחזיר את $a אם הוא קיים ואינו null, ואחרת את $b. זה קיצור של isset($a) ? $a : $b והוא לא מעלה אזהרה כש-$a או מפתח מערך לא מוגדרים.

מה ההבדל בין ?? ל-?: ב-PHP?

?? עובר לערך החלופי רק כשהצד השמאלי null או לא מוגדר, ולכן 0 ?? 5 הוא 0 ו-'' ?? 'x' הוא ''. ?: עובר לערך החלופי בכל פעם שהצד השמאלי שקרי, ולכן 0 ?: 5 הוא 5. בנוסף, ?: מזהיר על משתנים ומפתחות לא מוגדרים, ו-?? לא.

מה עושה ??= ב-PHP?

$a ??= $b מציב את $b ב-$a רק אם $a הוא null או לא מוגדר; אחרת הוא משאיר את $a כמו שהוא. זה קיצור של $a = $a ?? $b; והוא נוסף ב-PHP 7.4.

מה זה האופרטור nullsafe ?-> ב-PHP?

$obj?->method() קורא למתודה רק כש-$obj אינו null; אם הוא null, כל השרשרת מחזירה null במקום לזרוק שגיאה. שלבו אותו עם ?? לקבלת ברירת מחדל: $user?->getAddress()?->city ?? 'unknown'. הוא נוסף ב-PHP 8.0.

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

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

להתחיל