Menu

Heredoc ו-Nowdoc ב-PHP: מחרוזות מרובות שורות

heredoc ב-PHP הוא מחרוזת מרובת שורות שמתחילה ב-<<<EOT ומסתיימת ב-EOT; היא מחליפה משתנים כמו מחרוזת במירכאות כפולות. nowdoc, <<<'EOT', שומר את הטקסט בדיוק כפי שנכתב. כאן תלמדו את התחביר, כללי ההזחה, אינטרפולציה של מערכים ואובייקטים ותבניות HTML.

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

heredoc היא מחרוזת מרובת שורות. התחילו אותה ב-<<<EOT, כתבו את הטקסט בשורות הבאות, וסיימו ב-EOT; בשורה נפרדת. משתנים בפנים מוחלפים כמו במחרוזת במירכאות כפולות.

המזהה (EOT כאן) הוא אות או קו תחתון ואחריהם אותיות, ספרות או קווים תחתונים. נוהגים לבחור שמות שאומרים מה הטקסט: HTML, SQL, TEXT. חלק מהעורכים, ביניהם PhpStorm, צובעים את הגוף לפי השפה הזו כשהשם הוא HTML או SQL.

בניית תבנית HTML עם heredoc

heredoc היא הדרך הברורה ביותר לכתוב בלוק HTML עם ערכים בתוכו, כי ה-markup שומר על הצורה שלו ושום דבר לא צריך בריחה. הפלט הוא HTML, ולכן העורך מציג אותו בלשונית Page.

שני פרטים בבלוק הזה: איבר המערך עטוף בסוגריים מסולסלים, {$product['name']}, וסימן הדולר המילולי לפני המחיר מוברח כ-\$. שנו את השם או הוסיפו תגית והריצו שוב.

ערכים ממשתמשים חייבים לעבור בריחה לפני שהם נכנסים ל-HTML. ראו htmlspecialchars כדי להבין למה ואיך.

Nowdoc: טקסט בלי אינטרפולציה

nowdoc שם את המזהה בגרשיים בודדים: <<<'EOT'. שום דבר בפנים לא מוחלף, כך שסימני דולר ולוכסנים הפוכים נשארים כפי שנכתבו. השתמשו בו לדוגמאות קוד, לביטויים רגולריים ולכל טקסט שמכיל $.

הזחת סמן הסגירה

מאז PHP 7.3 אפשר להזיח את סמן הסגירה, וההזחה הזו מוסרת מכל שורה בגוף. כך heredoc בתוך פונקציה או if יכול לעקוב אחרי ההזחה של הקוד בלי שהרווחים יגיעו למחרוזת.

שורת ה-json_encode מראה את התוצאה תו אחרי תו: 8 רווחים הוסרו מכל שורה, כי TEXT; הסוגר מוזח ב-8.

שורה בגוף שמוזחת פחות מסמן הסגירה היא שגיאת תחביר:

$html = <<<HTML
  <p>Hello</p>
    HTML;
PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3

מערכים, אובייקטים וקריאות למתודות בתוך heredoc

heredoc פועל לפי אותם כללים כמו מירכאות כפולות. משתנים פשוטים עובדים לבד; למפתחות מערך במירכאות, למערכים מקוננים, למאפיינים ולקריאות למתודות, השתמשו בסוגריים מסולסלים.

heredoc כארגומנט לפונקציה

מאז PHP 7.3 אפשר לכתוב קוד נוסף אחרי סמן הסגירה באותה שורה, כך שאפשר להעביר heredoc ישירות לפונקציה או לשים אותו במערך. עם sprintf מקבלים תבנית שמצייני המקום שלה מתמלאים מאוחר יותר.

טעות נפוצה: נקודה ופסיק חסרים או טקסט נוסף אחרי הסמן

את מזהה הסגירה צריך לכתוב בדיוק כמו שנפתח (אותן אותיות גדולות וקטנות), ומה שבא אחריו באותה שורה חייב להיות PHP הגיוני. EOT; מסיים פקודה, EOT, ממשיך רשימת ארגומנטים. אות או ספרה מיד אחרי הסמן (EOTX;) מסתירות אותו, כך שהמחרוזת נמשכת עד סוף הקובץ ו-PHP מדווחת syntax error, unexpected end of file. המלכודת ההפוכה היא שורה בגוף שמתחילה במזהה ואחריו רווח או סימן פיסוק, כמו EOT is the marker: היא מסיימת את המחרוזת מוקדם, ושאר השורה נקרא כ-PHP (syntax error, unexpected identifier "is"). בחרו מזהה שאף פעם לא מופיע בתחילת שורה בטקסט, כמו HTML ל-markup או SQL לשאילתה.

שאלות נפוצות

מה זה heredoc ב-PHP?

דרך לכתוב מחרוזת מרובת שורות בלי מירכאות: מתחילים ב-<<<EOT וירידת שורה, כותבים את הטקסט, ומסיימים ב-EOT; בשורה נפרדת. משתנים בפנים מוחלפים, בדיוק כמו במחרוזת במירכאות כפולות, ואפשר להשתמש ב-" וב-' בחופשיות.

מה ההבדל בין heredoc ל-nowdoc?

heredoc (<<<EOT) מחליף משתנים ורצפי בריחה כמו מחרוזת במירכאות כפולות. nowdoc (<<<'EOT', המזהה בגרשיים בודדים) לא עושה אף אחד מהם ושומר כל $ ולוכסן הפוך כפי שנכתבו, כמו מחרוזת בגרשיים בודדים.

האם אפשר להזיח את סמן הסגירה של heredoc?

כן, מאז PHP 7.3. ההזחה של סמן הסגירה מוסרת מכל שורה בגוף, כך שאפשר להזיח heredoc כדי שיתאים לקוד. כל שורה בגוף חייבת להיות מוזחת לפחות כמו סמן הסגירה, אחרת PHP נעצרת עם שגיאת תחביר.

איך קוראים לפונקציה בתוך heredoc?

heredoc משלב רק משתנים, איברי מערך, מאפיינים וקריאות למתודות. קראו לפונקציה קודם ושמרו את התוצאה, או שמרו את שם הפונקציה או closure במשתנה וקראו לו בתוך סוגריים מסולסלים: $e = 'htmlspecialchars'; ואז {$e($text)}.

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

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

להתחיל