ב-PHP יש שמונה טיפוסים שמשתמשים בהם כל יום: int, float, string, bool, array, object, null, ועוד callable לפונקציות שמעבירים הלאה. למשתנה אין טיפוס קבוע; לערך הנוכחי שלו יש. var_dump($x) מציגה גם את הטיפוס וגם את הערך, ו-gettype($x) מחזירה את הטיפוס כמחרוזת.
העמודה הראשונה היא gettype(), והשנייה get_debug_type(). החליפו ערך בערך משלכם והריצו שוב. הן חלוקות על כמה שמות: gettype אומרת integer, double ו-boolean מסיבות היסטוריות, בעוד get_debug_type משתמשת בשמות מהצהרות הטיפוס (int, float, bool) ונותנת את שם המחלקה עבור אובייקט.
טיפוסי PHP במבט אחד
| טיפוס | דוגמה | הערות |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | מספרים שלמים, 64 ביט במערכות מודרניות |
float | 3.14, 1.5e3 | מספרים עשרוניים, לא מדויקים כמו בכל שפה |
string | "hi", 'hi' | רצף של בתים, לא של תווים |
bool | true, false | לא רגיש לאותיות גדולות וקטנות (גם TRUE עובד) |
array | [1, 2], ["a" => 1] | מפה מסודרת: רשימה ומילון באחד |
object | new User(), new stdClass() | מופע של מחלקה |
null | null | הערך היחיד מטיפוס null; גם "לא הוגדר ערך" |
callable | 'strlen', fn($x) => $x * 2 | כל דבר שאפשר לקרוא לו |
iterable | מערך או אובייקט Traversable | מה ש-foreach מקבלת |
resource | התוצאה של fopen() | ידית למשהו מחוץ ל-PHP |
בדיקת ערכים עם var_dump
var_dump היא הכלי לראות מה באמת יש לכם. היא מדפיסה את הטיפוס, את הערך, ועבור מחרוזות את האורך בבתים:
echo הייתה מדפיסה 10 עבור שלושת הראשונים ומסתירה את ההבדל. האורך ב-string(5) "café" סופר בתים, ולכן strlen ו-mb_strlen נותנות תוצאות שונות לטקסט שאינו ASCII.
מספרים שלמים ו-floats
מספר שלם הוא מספר ללא שבר. בליטרלים אפשר להשתמש בקווים תחתונים לקריאוּת, ובכתיב הקסדצימלי, אוקטלי ובינארי. float הוא כל מספר עם נקודה עשרונית או מעריך, וכמו בכל שפה הוא שומר את רוב השברים העשרוניים בקירוב:
לעולם אל תשוו floats עם ==; השוו את ההפרש לסובלנות קטנה, או עגלו קודם את שני הצדדים. לכסף, שמרו אגורות שלמות כמספרים שלמים.
בוליאנים ואילו ערכים הם false
bool הוא true או false. במקומות ש-PHP מצפה לתנאי (if, while, !), כל ערך מומר ל-bool, ורשימה קצרה של ערכים נחשבת false: false, 0, 0.0, "", "0", [] ו-null. כל השאר true. הטבלה מציגה כל ערך עם הטיפוס שלו, ההמרה שלו ל-bool והאם הוא מספרי:
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | |||
| 1 | |||
| -1 | |||
| 0.0 | |||
| 1.5 | |||
| "0" | |||
| "" | |||
| " " | |||
| "0.0" | |||
| "10" | |||
| "1e1" | |||
| "abc" | |||
| "null" | |||
| true | |||
| false | |||
| null | |||
| [] | |||
| [0] |
ההפתעות הן "0.0", " " ו-"null": שלושתן מחרוזות לא ריקות שאינן "0", ולכן הן true, ו-if ($value) מריצה את הגוף שלה עבורן.
מערכים, אובייקטים ו-null
מערך מחזיק כל תערובת של ערכים תחת מפתחות שלמים או מחרוזות. אובייקט הוא מופע של מחלקה; stdClass היא המחלקה הריקה של PHP לאובייקטים מהירים, ו-(object) הופכת מערך לאובייקט כזה. null פירושו "אין ערך":
בדיקת טיפוס עם פונקציות is_*
לכל טיפוס יש פונקציית בדיקה שמחזירה true או false. is_numeric שונה מ-is_int: היא מקבלת גם מחרוזות מספריות, וזה מה שרוצים כשבודקים קלט מטופס.
אחרות: is_bool, is_array, is_object, is_null, is_callable, is_iterable, ו-$x instanceof ClassName למחלקה מסוימת.
המרות אוטומטיות וטיפוסים מחמירים
PHP ממירה טיפוסים אוטומטית כשאופרטור צריך טיפוס אחר. מחרוזת מספרית שמשמשת בחשבון הופכת למספר, ו-. הופכת מספרים למחרוזות. מחרוזת שאינה מספרית בכלל לא ניתנת לחיבור, ו-PHP 8 זורקת TypeError:
גם פרמטרים עם טיפוס מומרים, אלא אם הקובץ מתחיל ב-declare(strict_types=1);. אז קריאה עם טיפוס סקלרי שגוי נכשלת במקום להיות מומרת:
כדי להמיר בכוונה, השתמשו ב-cast: (int) "42", (float) "3.5", (string) 10, (bool) "0". עמוד המרת הטיפוסים מכסה כל cast ואת מקרי הקצה שלו.
טעות נפוצה: השוואת טיפוסים שונים עם ==
כי == ממירה לפני ההשוואה, שני ערכים מטיפוסים שונים יכולים להיות "שווים" בדרכים שגורמות לבאגים, כמו "1e1" == "10" (שניהם המספר 10) או null == false. השתמשו ב-===, שדורשת גם אותו טיפוס, אלא אם אתם רוצים את ההמרה:
PHP 8 תיקנה את המקרה הגרוע ביותר: "abc" == 0 היה פעם true ועכשיו הוא false, כי מחרוזת שאינה מספרית מושווית כמחרוזת. הטבלאות המלאות נמצאות בעמוד אופרטורי ההשוואה.
שאלות נפוצות
איך בודקים את הטיפוס של משתנה ב-PHP?
var_dump($x) מדפיסה את הטיפוס והערך, למשל int(5). gettype($x) מחזירה את שם הטיפוס כמחרוזת ("integer"), ו-get_debug_type($x) מחזירה את השם המודרני ("int", או את שם המחלקה לאובייקטים). כדי לבדוק טיפוס אחד, השתמשו ב-is_int, is_string, is_array ובשאר פונקציות is_*.
למה gettype מחזירה "double" עבור float?
מסיבות היסטוריות gettype() מדווחת על floats כ-"double" ועל מספרים שלמים כ-"integer". get_debug_type(), שנוספה ב-PHP 8, מחזירה "float" ו-"int", אותם שמות שכותבים בהצהרות טיפוס.
אילו ערכים הם false ב-PHP?
בהמרה ל-bool, אלה הם false: false, 0, 0.0, "", "0", [] ו-null. כל השאר true, כולל "0.0", " " ו-"false".
מה המספר השלם המקסימלי ב-PHP?
PHP_INT_MAX, שהוא 9223372036854775807 במערכות 64 ביט. חיבור מעבר לו לא מתגלגל חזרה: התוצאה הופכת ל-float ומאבדת דיוק.
האם PHP היא שפה עם טיפוסים חזקים או חלשים?
PHP היא בעלת טיפוסים דינמיים, וכברירת מחדל היא ממירה טיפוסים כשהיא יכולה ("10" + 5 הוא 15). עם declare(strict_types=1); בראש הקובץ, קריאות לפונקציות עם טיפוסים באותו קובץ דוחות טיפוסים סקלריים שגויים עם TypeError במקום להמיר אותם.