Menu

טיפוסי נתונים ב-PHP: int, float, string, bool, array, null

ב-PHP יש עשרה טיפוסים: ארבעה סקלריים (int, float, string, bool), ארבעה מורכבים (array, object, callable, iterable) ושניים מיוחדים (null, resource). var_dump($x) מציגה את הטיפוס והערך, ו-gettype($x) מחזירה את שם הטיפוס.

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

ב-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 במבט אחד

טיפוסדוגמההערות
int42, -7, 0x1A, 1_000_000מספרים שלמים, 64 ביט במערכות מודרניות
float3.14, 1.5e3מספרים עשרוניים, לא מדויקים כמו בכל שפה
string"hi", 'hi'רצף של בתים, לא של תווים
booltrue, falseלא רגיש לאותיות גדולות וקטנות (גם TRUE עובד)
array[1, 2], ["a" => 1]מפה מסודרת: רשימה ומילון באחד
objectnew User(), new stdClass()מופע של מחלקה
nullnullהערך היחיד מטיפוס 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 והאם הוא מספרי:

gettype, (bool) ו-is_numeric לכל ערך של $x
Point at or tap a cell to read it as PHP.
$xgettypeboolis_numeric
0
1
-1
0.0
1.5
"0"
""
" "
"0.0"
"10"
"1e1"
"abc"
"null"
true
false
null
[]
[0]
Every cell computed by PHP 8.3.19.

ההפתעות הן "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 במקום להמיר אותם.

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

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

להתחיל