انتقل إلى محتوى الدرس
الدرس 11
دورة PHP

النصوص متعددة الأسطر Heredoc و Nowdoc والإسناد بالقيمة والمرجع في PHPPHP Heredoc Nowdoc and Value vs Reference Assignment

اكتب النصوص متعددة الأسطر بصيغتي Heredoc وNowdoc المرنتين في PHP 8، وأتقن الفرق بين إسناد المتغيرات بالقيمة وبالإشارة المرجعية.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تتيح صيغة Heredoc (<<<IDENTIFIER) كتابة نصوص متعددة الأسطر تعامل معاملة النصوص المزدوجة؛ فتقوم بتعويض المتغيرات ورموز الهروب دون الحاجة لتهريب علامات التنصيص ".

  • ابدأ النص بالرمز <<< متبوعاً بمعرّف واضح (مثل HTML أو EMAIL أو EOT) ثم سطر جديد.
  • يتم تعويض المتغيرات المباشرة ($name) والتعبيرات المحاطة بأقواس ({$OrderTotal}) تلقائياً داخل النص.
  • أغلِق الكتلة بكتابة نفس المعرّف متبوعاً بفاصلة منقوطة HTML; في سطر مستقل.

لاحظ كيف كُتبت علامات التنصيص المزدوجة حول "invoice-box" و"Paid in Full" مباشرة دون شرطة عكسية، مع تعويض $invoiceId و{$customer}.

مخطط توضيحي: محاكي النصوص متعددة الأسطر Heredoc وNowdoc في PHP
PHP
<?php
$customer = "Lina";
$invoiceId = 4092;

$card = <<<HTML
<div class="invoice-box" data-id="$invoiceId">
    <h2>Hello, {$customer}!</h2>
    <p>Status: "Paid in Full"</p>
</div>
HTML;

echo $card . "\n";

تحيط صيغة Nowdoc معرّف الفتح بعلامتي تنصيص مفردتين (<<<'IDENTIFIER') وتعامل النص متعدد الأسطر كنص خام حرفي تماماً دون تعويض متغيرات $vars أو رموز هروب.

  • توضع علامتا التنصيص المفردتان حول معرّف الفتح فقط (<<<'RAW')، بينما يكتب معرّف الإغلاق RAW; بدون علامات تنصيص.
  • مثالية لتضمين أمثلة الأكواد أو المسارات أو التعبيرات التي تحتوي على علامة الدولار $ والشرطة العكسية \ كما هي حرفياً.
  • حتى علامات التنصيص المفردة ' داخل كتلة Nowdoc لا تحتاج إلى أي تهريب.

لأن <<<'CODE' مكتوب بصيغة Nowdoc، يُطبع المسار C:\laragon\www\app والنص $price حرفياً كما هما دون تعويض.

PHP
<?php
$price = 99;

$snippet = <<<'CODE'
Path: C:laragonwwwapp
Formula: $total = $price * 1.15;
Note: Single 'quotes' and "double" quotes stay raw.
CODE;

echo $snippet . "\n";

في إصدارات PHP الحديثة (بما فيها PHP 8.4)، يمكن إزاحة وسم الإغلاق في Heredoc وNowdoc بالمسافات، ويقوم PHP تلقائياً بحذف نفس مقدار المسافات البادئة من كل سطر داخل الكتلة.

  • تحدد إزاحة وسم الإغلاق الهامش الأساسي الذي يتم اقتطاعه من بداية كل سطر داخل النص.
  • لا يجوز أن تكون إزاحة أي سطر داخل النص أقل من إزاحة وسم الإغلاق، وإلا أطلق مفسر PHP خطأً نحوياً ParseError.
  • لا تخلط أبداً بين المسافات (Spaces) وعلامات الجدولة (Tabs) في إزاحة نفس كتلة Heredoc أو Nowdoc.

لأن وسم الإغلاق YAML; مزاح بمقدار 4 مسافات، يحذف PHP أول 4 مسافات من كل سطر؛ فيبدأ السطر app: من بداية السطر ويحتفظ mode: بمسافتين نسبيتين.

PHP
<?php
$env = "production";

$configBlock = <<<YAML
    app:
      mode: "$env"
      debug: false
    YAML;

echo $configBlock . "\n";

عند إسناد نص أو رقم من متغير إلى آخر باستخدام المعامل =، ينفذ PHP الإسناد بالقيمة؛ فينشئ نسخة مستقلة منطقياً بحيث لا يؤثر تعديل أحدهما لاحقاً على الآخر.

  • إلحاق نص إضافي عبر .= بالمتغير المنسوخ يترك النص الأصلي دون أي تغيير.
  • يُعد الإسناد بالقيمة السلوك الافتراضي الآمن لأن تدفق البيانات يظل متوقعاً وخالياً من الآثار الجانبية الخفية.
  • يمكنك إعادة استخدام قالب Heredoc أساسي في عدة متغيرات دون إفساد القالب الأصلي.

لأن التعليمة $draftHeader = $baseHeader تنسخ بالقيمة، فإن إلحاق " (DRAFT COPY)" يعدّل $draftHeader فقط ويبقى الأصل سليماً.

مخطط تدفق التنفيذ العملي لقسم إسناد المتغيرات بالقيمة المستقلة افتراضياً في لغة PHP
PHP
<?php
$baseHeader = <<<TXT
Report: Monthly Sales
TXT;

$draftHeader = $baseHeader;
$draftHeader .= " (DRAFT COPY)";

echo $baseHeader . "\n";
echo $draftHeader . "\n";

وضع رمز العطف & بعد علامة المساواة ($alias = &$source) يربط اسمي المتغيرين بنفس حاوية القيمة النصية أو الرقمية في الذاكرة.

  • أي دمج نصي (.=) أو إعادة إسناد عبر الاسم المرجعي يعدّل المتغير الأصلي على الفور.
  • استخدم unset($alias) لقطع رابط المرجع عندما لا ترغب في انتقال التعديلات اللاحقة.
  • تجنب استخدام المراجع غير الضرورية مع النصوص العادية؛ لأن ميزة Copy-on-Write في PHP توفر الذاكرة تلقائياً.

الإلحاق النصي بالمتغير $activeStream يعدّل $logBuffer مباشرة لأنهما يشيران لنفس النص، ثم تقوم unset($activeStream) بفصل الاسم المستعار.

PHP
<?php
$logBuffer = "[INIT] Server ready";
$activeStream = &$logBuffer;
$activeStream .= " | [OK] Connected";

unset($activeStream);
echo $logBuffer . "\n";

استخدم هذا الجدول المقارن لاختيار صيغة النصوص متعددة الأسطر وطريقة الإسناد الأنسب في تطبيقات PHP.

  • اختر صيغة Heredoc (<<<ID) عندما تحتاج الكتلة النصية إلى تعويض المتغيرات ($var) أو رموز الهروب.
  • اختر صيغة Nowdoc (<<<'ID') عندما تريد بقاء الكتلة النصية خاماً بنسبة 100% دون تفسير $ أو \.
  • التزم بالإسناد بالقيمة الافتراضي (=) إلا إذا أردت عمداً ربط اسمين بنفس خانة الذاكرة عبر (=&).

تقوم صيغة Heredoc بتعويض $ver بالقيمة 8.4، بينما تحافظ صيغة Nowdoc على الأحرف $ver كما هي حرفياً.

الصيغة / المعاملتعويض المتغيرات $varsتفسير رموز \n و \tالاستخدام الأساسي
<<<ID ... ID; (Heredoc)YesYesMultiline HTML, SQL, or email templates with variables
<<<'ID' ... ID; (Nowdoc)No (Raw)No (Raw)Raw code snippets, Windows paths, and regex blocks
$b = $a (By Value)N/AN/ASafe independent variable copy (Copy-on-Write)
$b = &$a (By Reference)N/AN/AShared memory alias where edits affect both names
PHP
<?php
$ver = "8.4";
$heredoc = <<<EOT
Engine: PHP $ver
EOT;
$nowdoc = <<<'EOT'
Engine: PHP $ver
EOT;
echo $heredoc . " | " . $nowdoc . "\n";
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

استخدم هذا الجدول المقارن لاختيار صيغة النصوص متعددة الأسطر وطريقة الإسناد الأنسب في تطبيقات PHP. اختر صيغة Heredoc (<<<ID) عندما تحتاج الكتلة النصية إلى تعويض المتغيرات ($var) أو رموز الهروب. اختر صيغة Nowdoc (<<<'ID') عندما تريد بقاء الكتلة النصية خاماً بنسبة 100% دون تفسير $ أو \. التزم بالإسناد بالقيمة الافتراضي (=) إلا إذا أردت عمداً ربط اسمين بنفس خانة الذاكرة عبر (=&).

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Heredoc & References Heredoc والمراجع
اكتب النصوص متعددة الأسطر بصيغتي Heredoc وNowdoc المرنتين في PHP 8، وأتقن الفرق بين إسناد المتغيرات بالقيمة وبالإشارة المرجعية.
للمراجعة
02 Multiline Strings with Heredoc Syntax النصوص متعددة الأسطر بصيغة Heredoc
المفهوم الأساسي لقسم النصوص متعددة الأسطر بصيغة Heredoc في لغة PHP الحديثة.
للمراجعة
03 Literal Blocks with Nowdoc Syntax النصوص الخام بدون تعويض بصيغة Nowdoc
الصياغة البرمجية والتطبيق العملي المباشر لقسم النصوص الخام بدون تعويض بصيغة Nowdoc.
للمراجعة
04 Flexible Indented Closing Identifiers إزاحة وسم الإغلاق المرنة في PHP 8
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم إزاحة وسم الإغلاق المرنة في PHP 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PHP PHP
PHP: Hypertext Preprocessor
لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
للمراجعة
02 CLI CLI
Command-Line Interface
واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
للمراجعة
03 FPM FPM
FastCGI Process Manager
مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
للمراجعة
04 HTML HTML
HyperText Markup Language
لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم النصوص متعددة الأسطر بصيغة Heredoc للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم النصوص الخام بدون تعويض بصيغة Nowdoc وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

كيف تفتح كتلة نصية بصيغة Nowdoc في PHP؟

علامتا التنصيص المفردتان حول معرّف الفتح (<<<'EOT') تحددان صيغة Nowdoc.

02

ما الفرق السلوكي الأساسي بين صيغة Heredoc وصيغة Nowdoc؟

تعمل Heredoc مثل التنصيص المزدوج ""، وتعمل Nowdoc مثل التنصيص المفرد الخام ''.

03

في PHP 8، إذا كان وسم الإغلاق HTML; مزاحاً بـ 4 مسافات، فكيف يعالج PHP أسطر النص داخل الكتلة؟

تحدد إزاحة وسم الإغلاق عدد المسافات البادئة التي يتم حذفها من كل سطر.

04

عند استخدام وسم إغلاق مزاح في Heredoc، ما الذي يسبب خطأً نحوياً ParseError؟

يجب ألا تقل إزاحة أي سطر داخل الكتلة عن إزاحة وسم الإغلاق مع عدم خلط المسافات والجدولة.

05

لماذا لا تحتاج علامات التنصيص المزدوجة " داخل كتلة Heredoc إلى شرطة التهريب العكسية (\")؟

لا تنتهي كتلة Heredoc إلا بظهور معرّف الإغلاق في سطره المستقل.

06

ما ناتج تنفيذ الكود: $x = "A"; $y = $x; $y .= "B"; echo $x; ؟

بدون الرمز &، يكون $y نسخة مستقلة بالقيمة، فلا يتأثر $x عند تعديل $y.

07

ما ناتج تنفيذ الكود: $x = "A"; $y = &$x; $y .= "B"; echo $x; ؟

يشير كل من $x و$y إلى نفس النص في الذاكرة.

08

أي صيغة هي الأنسب لتخزين تعبير نمطي متعدد الأسطر أو مسار ويندوز مليء بالشرطات العكسية \ ورموز $؟

تحافظ صيغة Nowdoc على كل شرطة عكسية ورمز دولار كما هو حرفياً دون تهريب.