في هذا الدرس 6تصفّح المواضيع
تتيح صيغة Heredoc (<<<IDENTIFIER) كتابة نصوص متعددة الأسطر تعامل معاملة النصوص المزدوجة؛ فتقوم بتعويض المتغيرات ورموز الهروب دون الحاجة لتهريب علامات التنصيص ".
- ابدأ النص بالرمز
<<<متبوعاً بمعرّف واضح (مثلHTMLأوEMAILأوEOT) ثم سطر جديد. - يتم تعويض المتغيرات المباشرة (
$name) والتعبيرات المحاطة بأقواس ({$OrderTotal}) تلقائياً داخل النص. - أغلِق الكتلة بكتابة نفس المعرّف متبوعاً بفاصلة منقوطة
HTML;في سطر مستقل.
لاحظ كيف كُتبت علامات التنصيص المزدوجة حول "invoice-box" و"Paid in Full" مباشرة دون شرطة عكسية، مع تعويض $invoiceId و{$customer}.
<?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
$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
$env = "production";
$configBlock = <<<YAML
app:
mode: "$env"
debug: false
YAML;
echo $configBlock . "\n";
عند إسناد نص أو رقم من متغير إلى آخر باستخدام المعامل =، ينفذ PHP الإسناد بالقيمة؛ فينشئ نسخة مستقلة منطقياً بحيث لا يؤثر تعديل أحدهما لاحقاً على الآخر.
- إلحاق نص إضافي عبر
.=بالمتغير المنسوخ يترك النص الأصلي دون أي تغيير. - يُعد الإسناد بالقيمة السلوك الافتراضي الآمن لأن تدفق البيانات يظل متوقعاً وخالياً من الآثار الجانبية الخفية.
- يمكنك إعادة استخدام قالب Heredoc أساسي في عدة متغيرات دون إفساد القالب الأصلي.
لأن التعليمة $draftHeader = $baseHeader تنسخ بالقيمة، فإن إلحاق " (DRAFT COPY)" يعدّل $draftHeader فقط ويبقى الأصل سليماً.
<?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
$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) | Yes | Yes | Multiline 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/A | N/A | Safe independent variable copy (Copy-on-Write) |
$b = &$a (By Reference) | N/A | N/A | Shared memory alias where edits affect both names |
<?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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم النصوص متعددة الأسطر بصيغة Heredoc للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم النصوص الخام بدون تعويض بصيغة Nowdoc وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
كيف تفتح كتلة نصية بصيغة Nowdoc في PHP؟
علامتا التنصيص المفردتان حول معرّف الفتح (<<<'EOT') تحددان صيغة Nowdoc.
ما الفرق السلوكي الأساسي بين صيغة Heredoc وصيغة Nowdoc؟
تعمل Heredoc مثل التنصيص المزدوج ""، وتعمل Nowdoc مثل التنصيص المفرد الخام ''.
في PHP 8، إذا كان وسم الإغلاق HTML; مزاحاً بـ 4 مسافات، فكيف يعالج PHP أسطر النص داخل الكتلة؟
تحدد إزاحة وسم الإغلاق عدد المسافات البادئة التي يتم حذفها من كل سطر.
عند استخدام وسم إغلاق مزاح في Heredoc، ما الذي يسبب خطأً نحوياً ParseError؟
يجب ألا تقل إزاحة أي سطر داخل الكتلة عن إزاحة وسم الإغلاق مع عدم خلط المسافات والجدولة.
لماذا لا تحتاج علامات التنصيص المزدوجة " داخل كتلة Heredoc إلى شرطة التهريب العكسية (\")؟
لا تنتهي كتلة Heredoc إلا بظهور معرّف الإغلاق في سطره المستقل.
ما ناتج تنفيذ الكود: $x = "A"; $y = $x; $y .= "B"; echo $x; ؟
بدون الرمز &، يكون $y نسخة مستقلة بالقيمة، فلا يتأثر $x عند تعديل $y.
ما ناتج تنفيذ الكود: $x = "A"; $y = &$x; $y .= "B"; echo $x; ؟
يشير كل من $x و$y إلى نفس النص في الذاكرة.
أي صيغة هي الأنسب لتخزين تعبير نمطي متعدد الأسطر أو مسار ويندوز مليء بالشرطات العكسية \ ورموز $؟
تحافظ صيغة Nowdoc على كل شرطة عكسية ورمز دولار كما هو حرفياً دون تهريب.