print_r($array) מדפיסה מערך או אובייקט עם המפתחות והערכים שלו בצורה קריאה. var_dump($value) מדפיסה את אותו מבנה ועוד את הטיפוס והאורך של כל ערך. השתמשו ב-print_r כדי לראות מה יש במערך, וב-var_dump כשאתם צריכים לדעת אם ערך הוא "1" או 1.
השוו בין שני הפלטים עבור admin: print_r לא הדפיסה כלום אחרי החץ, var_dump הדפיסה bool(false). ההבדל הזה הוא הסיבה העיקרית לפנות ל-var_dump בזמן דיבאג.
print_r מול var_dump מול var_export
שלוש הפונקציות מציגות את אותם נתונים ברמות פירוט שונות:
print_r | var_dump | var_export | |
|---|---|---|---|
| מציגה טיפוסים | לא | כן | כליטרלים של PHP |
false, null, "" | לא מדפיסה כלום | bool(false), NULL, string(0) "" | false, NULL, '' |
| יכולה להחזיר מחרוזת | print_r($x, true) | לא | var_export($x, true) |
| הפלט הוא PHP תקין | לא | לא | כן |
| כמה ערכים בקריאה אחת | לא | var_dump($a, $b) | לא |
print_r הכי קלה לקריאה, var_dump הכי מדויקת, ו-var_export נותנת קוד שאפשר להדביק בחזרה לקובץ.
קבלת הפלט של print_r כמחרוזת
העבירו true כארגומנט השני ו-print_r תחזיר את הטקסט במקום להדפיס אותו. כך כותבים מערך לקובץ לוג או שמים אותו בתוך הודעה גדולה יותר.
var_export($value, true) מחזירה מחרוזת באותה דרך. var_dump תמיד מדפיסה, ולכן כדי ללכוד אותה צריך output buffering: ob_start(); var_dump($x); $text = ob_get_clean();.
הדפסה מעוצבת של מערך ב-HTML עם pre
בדפדפן, ירידות השורה והרווחים של print_r מתכווצים לשורה ארוכה אחת, כי HTML מתעלם מרווחים לבנים. עטפו את הפלט ב-<pre> כדי לשמור על הפריסה. הריצו את זה והסתכלו בלשונית Page.
htmlspecialchars חשובה ברגע שהנתונים עשויים להכיל < או &, למשל קלט משתמש: בלעדיה הדפדפן היה מתייחס לטקסט הזה כ-HTML. לנתונים ששולחים ל-JavaScript או ל-API, הצורה של json_encode היא לעיתים קרובות השימושית ביותר.
הצגת כמה ערכים בבת אחת
var_dump מקבלת כל מספר של ארגומנטים ומדפיסה כל אחד בתורו, וזה מהיר להשוואה בין שני ערכים זה לצד זה.
הפלט מראה למה == אומר שהם שווים ו-=== לא: אחד הוא string(2) "42", השני int(42).
הדפסת אובייקטים
שלוש הפונקציות מדפיסות גם אובייקטים. var_dump ו-print_r מסמנות מאפיינים פרטיים ומוגנים ([label:Point:private]), וזה עוזר כשנראה שמאפיין חסר.
ה-#1 בפלט של var_dump הוא המזהה של האובייקט. שני משתנים שמציגים אותו מזהה מצביעים על אותו אובייקט.
טעות נפוצה: echo על מערך
echo הופכת את הארגומנט שלה למחרוזת. למערך אין צורת מחרוזת, ולכן PHP מדפיסה את המילה Array ומעלה אזהרה:
<?php
$colors = ["red", "green", "blue"];
echo $colors;
PHP מדפיסה:
Warning: Array to string conversion in /home/index.php on line 3
Array
הדפיסו את התוכן עם אחת הפונקציות שלמעלה, או חברו את הערכים בעצמכם:
implode נועדה להצגת רשימה למשתמש, json_encode ללוגים ול-APIs, ו-print_r או var_dump לדיבאג שלכם.
שאלות נפוצות
מה ההבדל בין var_dump ל-print_r?
print_r מציגה מפתחות וערכים בצורה קצרה וקריאה. var_dump מציגה גם את הטיפוס והאורך של כל ערך, כמו string(3) "Ada" ו-bool(false), ולכן בה משתמשים כשהטיפוס חשוב. print_r(false) לא מדפיסה כלום, בעוד var_dump(false) מדפיסה bool(false).
איך מקבלים את הפלט של print_r כמחרוזת?
העבירו true כארגומנט השני: $text = print_r($array, true); מחזירה את הטקסט במקום להדפיס אותו, כך שאפשר לכתוב אותו ללוג עם error_log($text) או לשים אותו במשתנה. var_export($value, true) עובדת באותה דרך; ל-var_dump אין אפשרות כזו.
איך מדפיסים מערך יפה בדפדפן?
עטפו את הפלט בתגית <pre> כדי שהדפדפן ישמור על ירידות השורה וההזחה: echo '<pre>' . print_r($array, true) . '</pre>';. בצעו escape עם htmlspecialchars אם הנתונים יכולים להכיל HTML.
למה echo על מערך מדפיסה Array?
echo ממירה את הארגומנט שלה למחרוזת, ומערך מומר למילה Array עם האזהרה "Array to string conversion". השתמשו ב-print_r, ב-var_dump, ב-implode(', ', $arr) או ב-json_encode($arr) כדי להדפיס את התוכן.
מה var_export עושה ב-PHP?
היא מדפיסה ערך כקוד PHP תקין, למשל array ( 0 => 'a', ), שאפשר להדביק בחזרה לסקריפט. עם true כארגומנט השני היא מחזירה את הקוד כמחרוזת, וכך כלים מסוימים כותבים קובצי הגדרות שמורים במטמון.