empty($var) מחזירה true אם המשתנה לא קיים או שהערך שלו שקרי: null, false, 0, 0.0, "", "0" או מערך ריק []. לכל ערך אחר היא מחזירה false. כמו isset(), היא אף פעם לא מזהירה על משתנים או מפתחות מערך לא מוגדרים.
empty($x) זהה ל-!isset($x) || !$x. במילים אחרות: חסר, או מומר ל-false.
אילו ערכים ריקים
בחרו ערך בטבלה כדי לראות את empty() ליד isset() וליד ההמרה (bool). כל תא חושב על ידי PHP 8.3.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
ההפתעות נמצאות בשני הקצוות: "0" ריק, בעוד " " (רווח), "0.0", "null" ו-[0] לא.
"0" ריק: הבאג הקלאסי
כיוון ש-"0" שקרי, empty() מתייחסת לכמות 0, לציון 0 או לקוד PIN "0" כאל "לא הוזן כלום". זה פוגע בטפסים, שבהם כל ערך מגיע כמחרוזת.
לקלט טקסט, הבדיקה האמינה ל"לא הוזן כלום" היא trim($value) === "". השאירו את empty() לערכים שבהם 0 באמת אומר כלום.
בדיקה אם מחרוזת ריקה
כדי לבדוק בדיוק מחרוזת ריקה, השוו ל-"". כדי להתייחס גם לרווחים כריקים, הפעילו קודם trim. מאז PHP 5.5 empty() מקבלת ביטויים, אז גם empty(trim($s)) עובד (אבל עם אותה בעיה של "0").
trim() לא מקבלת null בלי הודעת deprecation ב-PHP 8.1 ואילך, ולכן הבלוק כותב trim($s ?? "").
בדיקה אם מערך ריק
במערכים, empty($arr), $arr === [] ו-count($arr) === 0 נותנים כולם אותה תשובה. ל-empty() יש יתרון: היא עובדת על משתנה או מפתח שאולי לא קיימים.
array_filter() בלי callback מסירה כל ערך שקרי, ולכן זו דרך מהירה לשאול "האם המערך הזה מכיל משהו אמיתי".
אימות שדה חובה בטופס
!empty() היא דרך נפוצה לחייב שדה, כל עוד 0 אינו תשובה תקינה. הריצו את הבלוק, השאירו את השדות ריקים ולחצו על Send, ואז מלאו אותם ושלחו שוב: הסקריפט ירוץ פעם נוספת כש-$_POST מלא.
empty($_POST["terms"]) מכסה את שני המקרים של תיבת הסימון: לא נשלחה בכלל, או נשלחה עם ערך ריק. עמוד הטפסים מתקדם יותר עם הודעות שגיאה לכל שדה.
empty מול isset
שתיהן בטוחות על משתנים ומפתחות לא מוגדרים. הן עונות על שאלות שונות:
isset($x): האם זה קיים ואינוnull? השתמשו בה למפתחות אופציונליים, לתיבות סימון ול"האם זה נשלח בכלל".!empty($x): האם זה קיים ואמיתי? השתמשו בה ל"יש משהו אמיתי", כש-0ו-"0"לא נחשבים.$x === ""או$x === []: האם זה ריק בדיוק? השתמשו בזה כש-0הוא ערך תקין.
עמוד isset מכסה את החצי השני, כולל isset() עם כמה משתנים בבת אחת וההבדל מ-array_key_exists().
שאלות נפוצות
אילו ערכים empty() מחשיבה כריקים ב-PHP?
empty($x) היא true כש-$x לא קיים או שהוא null, false, 0, 0.0, "", "0" או []. כל השאר לא ריק, כולל " " (רווח), "0.0", "false" ו-[0].
למה "0" נחשב ריק ב-PHP?
empty() זהה ל-!$x בלי האזהרה על משתנים לא מוגדרים, והמחרוזת "0" מומרת ל-false. זה הופך את empty() לשגויה בשדות שבהם 0 הוא תשובה תקינה; בדקו במקום זאת $x === '' או trim($x) === ''.
איך בודקים אם מערך ריק ב-PHP?
גם empty($arr) וגם $arr === [] עובדים, וכך גם count($arr) === 0. empty() מחזירה true גם כשהמשתנה לא מוגדר, בעוד count() על משתנה לא מוגדר הייתה מזהירה ואז זורקת TypeError עבור null.
מתי להשתמש ב-empty() במקום ב-isset()?
השתמשו ב-isset() כשצריך לדעת רק שערך קיים (תיבת סימון נשלחה, מפתח הגדרות נמצא). השתמשו ב-!empty() כשהערך חייב גם לא להיות ריק, למשל שדה טקסט חובה. היזהרו בשדות שבהם 0 תקין, כי empty('0') הוא true.