Menu
flag Ar iconالعربيةdown icon

Heredoc وNowdoc في PHP: النصوص متعددة الأسطر

Heredoc في PHP نص متعدد الأسطر يبدأ بـ <<<EOT وينتهي بـ EOT، ويستبدل المتغيرات كالنص بين علامتي تنصيص مزدوجتين. أما nowdoc، <<<'EOT'، فيحتفظ بالنص كما كُتب. تعلّم الصياغة وقواعد المسافات البادئة واستيفاء المصفوفات والكائنات وقوالب HTML.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

Heredoc نص متعدد الأسطر. ابدأه بـ <<<EOT، واكتب النص في الأسطر التالية، ثم أنهِه بـ EOT; في سطر مستقل. تُستبدل المتغيرات داخله كما في النص بين علامتي تنصيص مزدوجتين.

المعرّف (EOT هنا) حرف أو شرطة سفلية تليها أحرف أو أرقام أو شرطات سفلية. يختار المبرمجون أسماء تدل على محتوى النص: HTML وSQL وTEXT. وبعض المحررات، ومنها PhpStorm، تلوّن الجسم بصياغة تلك اللغة عندما يكون الاسم HTML أو SQL.

بناء قالب HTML باستخدام heredoc

Heredoc أوضح طريقة لكتابة كتلة HTML فيها قيم، لأن الوسوم تحتفظ بشكلها ولا شيء يحتاج إلى تهريب. المخرجات 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 للوسوم أو SQL للاستعلام.

الأسئلة الشائعة

ما heredoc في PHP؟

طريقة لكتابة نص متعدد الأسطر دون علامات تنصيص: ابدأ بـ <<<EOT وسطر جديد، واكتب النص، ثم أنهِه بـ EOT; في سطر مستقل. تُستبدل المتغيرات داخله تمامًا كما في النص بين علامتي تنصيص مزدوجتين، ويمكنك استخدام " و' بحرية.

ما الفرق بين heredoc وnowdoc؟

يستبدل heredoc (<<<EOT) المتغيرات وتسلسلات الهروب كالنص بين علامتي تنصيص مزدوجتين. أما nowdoc (<<<'EOT'، والمعرّف بين علامتي تنصيص مفردتين) فلا يفعل أيًا منهما ويحتفظ بكل $ وكل شرطة مائلة عكسية كما كُتبت، كالنص بين علامتي تنصيص مفردتين.

هل يمكن إزاحة علامة إغلاق heredoc؟

نعم، منذ PHP 7.3. تُزال إزاحة علامة الإغلاق من كل سطر في الجسم، لذا يمكنك إزاحة heredoc لتطابق كودك. ويجب أن يكون كل سطر في الجسم مزاحًا على الأقل بقدر علامة الإغلاق، وإلا توقفت PHP بخطأ تحليل.

كيف أستدعي دالة داخل heredoc؟

لا يستوفي heredoc إلا المتغيرات وعناصر المصفوفات والخصائص واستدعاءات الدوال التابعة. استدعِ الدالة أولًا وخزّن النتيجة، أو احفظ اسم الدالة أو دالة مغلقة في متغير واستدعِها داخل الأقواس: $e = 'htmlspecialchars'; ثم {$e($text)}.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن