الانتقال من Dompdf إلى NextPDF
نظرة سريعة
قسم بعنوان «نظرة سريعة»يساعدك هذا الدليل على نقل قاعدة شفرة قائمة على Dompdf تُنشئ ملفات تنسيق المستندات المحمولة (PDF) من لغة ترميز النص التشعبي (HTML) إلى مسار Html في NextPDF. تُنقَل معظم مواضع الاستدعاء مباشرة لأن المكتبتين تتبعان التدفق العام نفسه: تحميل HTML، وعرضه، وإصدار PDF. يكمن العمل الحقيقي في خريطة الخيارات واختلافات دعم صفحات الأنماط المتتالية (CSS). NextPDF وDompdf محركان مستقلان، لذا فإن أي تخطيط أنتجه Dompdf يكون متوافقاً مع نتيجة NextPDF، لا مطابقاً لها على مستوى البايت. يغطي هذا الدليل تعيين الأفعال، وتعيين مفاتيح الخيارات، والاختلافات السلوكية، وتسلسل انتقال آمن.
لا يضمن دعم NextPDF لميزة HTML/CSS إعادة إنتاج مستند Dompdf بكسلاً ببكسل. تُعدّ مصفوفة دعم CSS المرجع المعتمد للميزات المُتحقَّق منها. يصف هذا الدليل السلوك، ولا يدّعي التكافؤ البصري.
التثبيت
قسم بعنوان «التثبيت»composer require nextpdf/core:^3أبقِ dompdf/dompdf مثبَّتاً أثناء الانتقال. يُشغّل تسلسل الانتقال الآمن المحركين جنباً إلى جنب حتى يُحوَّل كل موضع استدعاء. أزِله بعد اكتمال التحويل.
نظرة مفاهيمية
قسم بعنوان «نظرة مفاهيمية»كائن Dompdf في Dompdf واجهة واحدة تملك نموذج كائن المستند (DOM)، وورقة الأنماط، وشجرة الإطارات، واللوحة. يفصل NextPDF هذه الاهتمامات: يملك NextPDF\Core\Document نموذج الصفحة والإخراج، ويقود writeHtml() مسار HTML. لا توجد مرحلة منفصلة من خطوتين: “العرض، ثم الإخراج”. يُخطِّط writeHtml() المحتوى أثناء كتابته، وتُصدِر المستند باستخدام save() أو output() أو getPdfData().
محتوى الصفحة الذي يكتبه NextPDF هو رسم لتدفق المحتوى وفق ISO 32000-2 (ISO 32000-2 §8، iso32000_2_sec8#x1.x3.p14). تُعيَّن هندسة الصفحة التي يتحكم فيها خيار حجم الورق إلى الكائن MediaBox للصفحة (ISO 32000-2 §7، iso32000_2_sec7#x1.x104.p10). هذه أساسيات في المحرك يتشاركها أي كاتب متوافق. أما خوارزمية التخطيط التي تحوّل CSS إلى ذلك المحتوى، فهي خاصة بـ NextPDF وتختلف عن خوارزمية Dompdf؛ راجع الاختلافات السلوكية.
سطح واجهة برمجة التطبيقات
قسم بعنوان «سطح واجهة برمجة التطبيقات»وُثِّقت واجهة برمجة التطبيقات (API) الخاصة بـ Html في NextPDF ضمن مرجع وحدة Html، الذي يُولَّد تلقائياً من PHPDoc. نقاط الدخول المستخدمة أدناه هي Document::createStandalone() وDocument::writeHtml(string $html): static وDocument::writeHtmlCell(...) وDocument::output(?string, OutputDestination) وDocument::save(string $path): void وDocument::getPdfData(): string، وكائن القيمة NextPDF\Core\Config (pageSize، margins، fontsDirectory).
تعيين أفعال واجهة برمجة التطبيقات
قسم بعنوان «تعيين أفعال واجهة برمجة التطبيقات»أسماء واجهة برمجة التطبيقات العامة لـ Dompdf الواردة أدناه مؤكَّدة مقابل المستودع العام الأصلي (dompdf/dompdf، master)؛ راجع ملف مصدر التتبّع داخل المستودع _source-sidecar-upstream-api.md. لم يُعاد إنتاج أي نص من التوثيق الأصلي.
| Dompdf | NextPDF | ملاحظات |
|---|---|---|
new Dompdf($options) | Document::createStandalone($config) | يأخذ Dompdf كائن Options؛ بينما يأخذ NextPDF كائن NextPDF\Core\Config. استخدم DocumentFactory للعمال طويلي الأمد بدلاً من createStandalone(). |
$dompdf->loadHtml($html, $encoding) | $doc->writeHtml($html) | يعامل NextPDF المدخلات على أنها UTF-8. حوِّل ترميز المدخلات غير المُرمَّزة بـ UTF-8 قبل الاستدعاء بدلاً من تمرير وسيطة ترميز. |
$dompdf->loadHtmlFile($file) | $doc->writeHtml(file_get_contents($file)) | لا يوفّر NextPDF صيغة لتحميل الملفات. اقرأ الملف بنفسك لتبقى سياسة الموارد ضمن شفرتك. |
$dompdf->setPaper($size, $orientation) | ConfigpageSize (كائن قيمة PageSize) | راجع خريطة الخيارات. |
$dompdf->render() | (ضمني) | يُخطِّط NextPDF أثناء writeHtml()؛ لا توجد مرحلة عرض منفصلة. أزِل استدعاء render(). |
$dompdf->output() | $doc->getPdfData() | يُرجِع بايتات PDF. |
$dompdf->stream($name, $opts) | $doc->output($name, OutputDestination::Download) | يختار NextPDF الوجهة باستخدام التعداد OutputDestination. |
$dompdf->setBasePath($p) / setProtocol() / setBaseHost() | (حلّ الموارد يختلف) | يحلّ NextPDF الموارد النسبية مقابل مجموعة عمل المستند، لا مقابل ثلاثية path/protocol الأساسية؛ راجع الاختلافات السلوكية. |
$dompdf->addInfo($label, $value) | $doc->setTitle() / setAuthor() / واجهة برمجة تطبيقات البيانات الوصفية | تُعيَّن أزواج المعلومات حرّة الشكل في Dompdf إلى أدوات ضبط البيانات الوصفية المُصنَّفة (ISO 32000-2 معلومات المستند §14، iso32000_2_sec14#x1.x5.p5). |
$dompdf->setHttpContext($ctx) | (لا يوجد مكافئ) | لا يجلب NextPDF الموارد البعيدة عبر سياق دفق؛ راجع غير مدعوم / لا يوجد مكافئ مباشر. |
مثال شفرة — بداية سريعة
قسم بعنوان «مثال شفرة — بداية سريعة»<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
// Dompdf:// $dompdf = new Dompdf();// $dompdf->loadHtml('<h1>Invoice</h1>');// $dompdf->setPaper('A4', 'portrait');// $dompdf->render();// file_put_contents('out.pdf', $dompdf->output());
// NextPDF — the createStandalone() default page size is A4 portrait:$doc = Document::createStandalone();$doc->setTitle('Invoice');$doc->addPage();$doc->writeHtml('<h1>Invoice</h1>');$doc->save(__DIR__ . '/out.pdf');
echo "Wrote out.pdf\n";مثال شفرة — للإنتاج
قسم بعنوان «مثال شفرة — للإنتاج»يحاكي هذا المثال examples/08-html-basic.php، وهو السند القابل للتشغيل لهذا الدليل، مع حجم ورق غير افتراضي صريح وهوامش. وهو يطابق استدعاء setPaper() في Dompdf إضافةً إلى ضبط هوامش Options.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\OutputDestination;use NextPDF\Core\Config;use NextPDF\Core\Document;use NextPDF\ValueObjects\Margin;use NextPDF\ValueObjects\PageSize;
// Equivalent of: $dompdf->setPaper('letter','portrait') + margin options.// US Letter portrait = 612 x 792 pt.// Margin constructor order is (top, right, bottom, left) — all 0.5in here.$config = new Config( pageSize: new PageSize(612.0, 792.0, 'Letter'), margins: new Margin(36.0, 36.0, 36.0, 36.0), // top,right,bottom,left; 0.5in in points);
$doc = Document::createStandalone($config);$doc->setTitle('Quarterly Report');$doc->setAuthor('Finance');$doc->addPage();
$html = <<<'HTML'<h1 style="color:#1E3A8A;">Quarterly Report</h1><p>This report renders through the NextPDF Html pipeline. The CSS subset thatis <strong>Verified</strong> for production is the support-matrix authority,not this page.</p><table border="1"> <tr><th>Region</th><th>Total</th></tr> <tr><td>EMEA</td><td>1,204</td></tr></table>HTML;
$doc->writeHtml($html);
// Equivalent of $dompdf->stream('report.pdf'):$doc->output('report.pdf', OutputDestination::Download);الحالات الحدّية والمزالق
قسم بعنوان «الحالات الحدّية والمزالق»- لا عرض من مرحلتين. شفرة Dompdf التي تفحص الحالة بين
render()وoutput()، مثل قراءة عدد الصفحات، لا تملك مكافئاً في NextPDF عند ذلك الحد بالضبط. استعلم عن المستند بعدwriteHtml()بدلاً من ذلك. - الترميز. يحذف NextPDF وسيطة
$encodingالخاصة بـ Dompdf. حوِّل المدخلات إلى UTF-8 قبلwriteHtml(). تمرير بايتات Latin-1 يُنتج نصاً مشوَّهاً، لا خطأً. render()مُترَك في مكانه. أي استدعاء متبقٍّ من نمط$dompdf->render()ليس له طريقة في NextPDF ويفشل بخطأ فادح “طريقة غير معرَّفة”. احذفه أثناء التحويل؛ لا تضع له بديلاً وهمياً.- PHP المُضمَّن. يقيّم
enable_phpفي Dompdf العنصر<script type="text/php">. لا يوفّر NextPDF أي تنفيذ لـ PHP داخل المستند بحكم التصميم لأنه سطح حقن. انقل ذلك المنطق إلى شفرة PHP لديك قبلwriteHtml(). - حلّ الموارد النسبية. يحلّ Dompdf العنصر
<img src>مقابل ثلاثية path/protocol/host الأساسية. ويحلّ NextPDF مقابل مجموعة عمل المستند. أثناء الانتقال، مرِّر مسارات مطلقة أو معرِّفات موارد منتظمة (URI) بصيغة بيانات محلولة مسبقاً لإزالة ذلك المتغيِّر.
الأداء
قسم بعنوان «الأداء»يُخطِّط writeHtml() في تمريرة دفق واحدة، كما هو موصوف في سجل قرار البنية ADR-001. لا يوجد كائن شجرة إطارات وسيط مُحتفَظ به بعد التخطيط، لذلك تتبع ذروة الذاكرة حجم المستند بدلاً من عدد عُقد DOM. ميزانية الأداء لمثال هذا الدليل هي wall_ms: 2000, peak_mb: 128. للمستندات الكبيرة، قسِّم HTML عبر حدود addPage() بدلاً من بناء سلسلة واحدة بحجم عدة ميغابايت.
ملاحظات أمنية
قسم بعنوان «ملاحظات أمنية»- لا جلب بعيد عبر سياق دفق. لا يُنفِّذ NextPDF مسار الجلب البعيد
setHttpContext()/enable_remoteالخاص بـ Dompdf. حُلّ الموارد البعيدة وتحقَّق منها في تطبيقك، ثم مرِّر بايتات أو معرِّفات موارد بصيغة بيانات. هذا يزيل سطح تزوير الطلب من جانب الخادم (SSRF) الذي يحملهenable_remote. - لا تنفيذ شفرة داخل المستند. غياب مكافئ لـ
enable_phpهو تصليب أمني متعمَّد، لا ثغرة. - تُكتَب البيانات الوصفية للمستند التي تضبطها عبر أدوات الضبط المُصنَّفة في قاموس المعلومات §14 من ISO 32000-2 / منصة البيانات الوصفية القابلة للتوسعة (XMP) (
iso32000_2_sec14#x1.x5.p5). لا تضع أي أسرار هناك.
المطابقة
قسم بعنوان «المطابقة»| البيان | المواصفة | البند | reference_id |
|---|---|---|---|
| محتوى الصفحة رسم لتدفق محتوى في النموذج opaque/transparent. | ISO 32000-2 |
§8 | || يُعيَّن حجم الورق إلى صندوق حدود الكائن للصفحة. | ISO 32000-2 | §7 | | | تُكتَب خطوط HTML على هيئة برامج خطوط embedded/subset. | ISO 32000-2 | §9 | | | معالجة المسافات البيضاء / فواصل الأسطر خاصة بالمحرك. | CSS Text 3 | §6.5 | |
ينتج NextPDF محتوى ISO 32000-2. وهو لا يدّعي أن مستند Dompdf المنقول مطابق بصرياً. أعِد مراجعة الإخراج كلما غيَّرت المحرِّكات.
السياق التجاري
قسم بعنوان «السياق التجاري»غير منطبق. يغطي Core مسار الانتقال هذا من HTML إلى PDF.
انظر أيضاً
قسم بعنوان «انظر أيضاً»تفاصيل الانتقال (أقسام R6 المطلوبة)
قسم بعنوان «تفاصيل الانتقال (أقسام R6 المطلوبة)»لمن هذا الدليل
قسم بعنوان «لمن هذا الدليل»استخدم هذا الدليل إذا كان فريقك يُشغِّل dompdf/dompdf لتحويل HTML إلى PDF من جانب الخادم ويريد الانتقال إلى محرك NextPDF. إذا كنت تستدعي فقط loadHtml / setPaper / render / output، فإن تعيين الأفعال يغطي سطحك بالكامل.
النطاق
قسم بعنوان «النطاق»ضمن النطاق: أفعال واجهة Dompdf، ومفاتيح Options، وتوقعات تكافؤ ميزات CSS، وحلّ الموارد، والبيانات الوصفية. خارج النطاق: كائنات Dompdf الداخلية FrameTree/Canvas/Stylesheet. لا يوفّر NextPDF مكافئات عامة لها، لذلك لا تنقل شفرة تصل إليها؛ استبدلها بواجهة برمجة التطبيقات العامة.
خريطة التوافق
قسم بعنوان «خريطة التوافق»تعني التغطية توافقاً سلوكياً، لا بديلاً جاهزاً للإسقاط. لا يوفّر NextPDF بديلاً لفئة Dompdf (على عكس مسار TCPDF؛ راجع /migration/tcpdf-compat/). أعِد كتابة كل موضع استدعاء باستخدام تعيين الأفعال. تضبط الصفوف المُتحقَّق منها في مصفوفة دعم CSS توقعات ميزات CSS بالكامل. لا يعيد هذا الدليل بيان حالة كل خاصية.
خريطة الخيارات والضبط
قسم بعنوان «خريطة الخيارات والضبط»| خيار Dompdf (المفتاح / أداة الضبط) | NextPDF | ملاحظات |
|---|---|---|
default_paper_size / setDefaultPaperSize() ; setPaper($size,...) | Config->pageSize (كائن قيمة PageSize) | تصبح الأحجام المُسمّاة أبعاداً صريحة بالنقاط. new PageSize(595.276, 841.890, 'A4') هو افتراضي createStandalone(). |
default_paper_orientation / setDefaultPaperOrientation() | بدِّل PageSize width/height | لا يملك NextPDF علم اتجاه. الصفحة الأفقية هي PageSize بعرض > ارتفاع. |
dpi / setDpi() | (ليس مفتاحاً عاماً) | يعمل NextPDF بنقاط PDF (1/72 بوصة). يُحدَّد حجم الصور لكل صورة على حدة، لا بوصفه مُضاعِفاً عاماً للنقاط لكل بوصة (DPI) على مستوى المستند. أعِد حساب أحجام البكسل الثابتة إلى نقاط. |
enable_remote / setIsRemoteEnabled() | (لا يوجد مكافئ — بحكم التصميم) | حُلّ الموارد البعيدة في شفرتك؛ راجع الملاحظات الأمنية. |
enable_html5_parser / setIsHtml5ParserEnabled() | (يُحلِّل HTML دائماً) | لا يوجد مفتاح تبديل؛ المُحلِّل هو المسار. |
enable_php / setIsPhpEnabled() | (لا يوجد مكافئ — بحكم التصميم) | PHP داخل المستند غير مدعوم. انقل المنطق خارج القالب. |
font_dir / setFontDir() | Config->fontsDirectory | سلسلة دليل خطوط واحدة. |
chroot | (حُلّ في التطبيق) | لا يقبل NextPDF خيار سجن نظام الملفات. تحقَّق من المسارات قبل تمرير البايتات. |
default_font / setDefaultFont() | CSS font-family / خط مُسجَّل | اضبط الافتراضي في ورقة الأنماط الأساسية لديك أو في تسجيل الخطوط، لا في خيار عام. |
enable_font_subsetting / setIsFontSubsettingEnabled() | (يُجزِّئ دائماً) | يُجزِّئ NextPDF الخطوط المُضمَّنة دائماً (ISO 32000-2 §9، iso32000_2_sec9#x1.x45.p7). لا يوجد “إيقاف”؛ مسار Dompdf بعلم مُوقَف لا مكافئ له وغير مطلوب. |
الاختلافات السلوكية
قسم بعنوان «الاختلافات السلوكية»- محرك التخطيط. يستخدم Dompdf وNextPDF تطبيقي تخطيط CSS مستقلين. طيّ المسافات البيضاء وفواصل الأسطر محدَّدان في المواصفة، لكنهما يظلان حساسين للمحرك (CSS Text 3 §6.5،
css_text_3#x1.x6.x5.p20). توقَّع اختلافات في التفاف الأسطر وترقيم الصفحات في النص الكثيف. أعِد ضبط خط الأساس لفروق المقارنة البصرية بعد الانتقال. - حدّ العرض. لا حدّ من مرحلتين
render()/output()(راجع الحالات الحدّية). - حلّ الموارد. معالجة المسار/البروتوكول/المضيف الأساسية تختلف عن مجموعة عمل المستند.
- نموذج DPI. نقاط PDF تختلف عن مُضاعِف DPI الخاص بـ Dompdf.
- البيانات الوصفية. أزواج
addInfo()حرّة الشكل تختلف عن أدوات الضبط المُصنَّفة (ISO 32000-2 §14،iso32000_2_sec14#x1.x5.p5).
هذه اختلافات سلوكية موثَّقة، وليست عيوباً في أيٍّ من المحركين.
غير مدعوم / لا يوجد مكافئ مباشر
قسم بعنوان «غير مدعوم / لا يوجد مكافئ مباشر»enable_php(PHP داخل المستند) — غائب عن قصد.setHttpContext()/enable_remoteالجلب البعيد — غائب عن قصد.- الوصول العام إلى
FrameTree/Canvas/Stylesheet— لا يوجد مكافئ عام. dpiكمُضاعِف عام على مستوى المستند — غير مُنمذَج.
الشفرة التي تعتمد على هذه العناصر لا “تنتقل”. أزِلها أو أعِد التعبير عنها في شفرة التطبيق باستخدام الصفوف أعلاه.
تسلسل الانتقال الآمن
قسم بعنوان «تسلسل الانتقال الآمن»- أضِف
nextpdf/coreجنباً إلى جنب معdompdf/dompdf. لا تُزِل Dompdf بعد. - اختر مستنداً واحداً منخفض المخاطر. أعِد كتابة موضع استدعائه باستخدام تعيين الأفعال، واحذف استدعاء
render(). - أنشئ كلا ملفي PDF من نفس المدخلات وقارِنهما بصرياً. عامِل الاختلافات على أنها متوقَّعة لأن المحركين مستقلان، وقرِّر القبول لكل مستند.
- حوِّل استخدام الخيارات باستخدام خريطة الخيارات؛ أعِد حساب الأحجام المشتقة من DPI إلى نقاط.
- حُلّ مسبقاً الموارد البعيدة والنسبية إلى مسارات مطلقة أو معرِّفات موارد بصيغة بيانات لإزالة متغيِّر الحلّ.
- كرِّر لكل مستند، من الأقل مخاطرةً إلى الأعلى. أبقِ كلا المحركين مثبَّتين حتى يُحوَّل آخر موضع استدعاء.
- أزِل
dompdf/dompdfمنcomposer.jsonفقط بعد آخر تحويل.
اختبار الانتقال
قسم بعنوان «اختبار الانتقال»- التقط لقطة لإخراج Dompdf لمستندات تمثيلية قبل تغيير الشفرة. استخدم مدخلات ذهبية، لا بايتات ذهبية، لأن البايتات ستختلف.
- لكل مستند منقول، مرِّر إخراج NextPDF عبر فحص القبول الخاص بك، مثل المقارنة البصرية أو تأكيدات استخراج النص. سلوك مسار HTML الخاص بـ NextPDF مغطّى بـ
examples/08-html-basic.phpومجموعة Html الخاصة بـtests/في Core. قبول الانتقال خاص بكل مستند، وأنت مسؤول عن تأكيده. - أضِف اختبار انحدار لكل مستند منقول لرصد أي تحديث مستقبلي للمحرك.
الأدلة / إمكانية التتبّع
قسم بعنوان «الأدلة / إمكانية التتبّع»كل بيان سلوكي عن NextPDF في هذه الصفحة مدعوم باختبار داخل المستودع، أو مثال، أو توقيع مصدر، أو سجل قرار بنية (ADR)، أو، لخصائص تنسيق PDF، ببنود ISO 32000-2 / CSS المثبَّتة عبر التوليد المعزَّز بالاسترجاع (RAG) في citations: في البيانات الأمامية وجدول المطابقة. سلوك Dompdf مؤكَّد فقط على أنه “محرك مستقل — توقَّع اختلافات موثَّقة”. لا تدّعي هذه الصفحة أي تكافؤ ما لم يُثبته أثر داخل المستودع.
| بيان NextPDF السلوكي | الأدلة داخل المستودع (المسار) |
|---|---|
الصفحة الافتراضية لـ createStandalone() هي A4 طولية (595.276 × 841.890 pt). | src/Core/Config.php (الافتراضي PageSize(595.276, 841.890, 'A4'))؛ tests/Unit/Core/DocumentCreateStandaloneAndConfigWithersEdgeCaseTest.php (createStandaloneWithNullConfigBuildsDocumentWithA4Defaults). |
يُخطِّط writeHtml() في تمريرة دفق واحدة؛ لا DOM مُحتفَظ به بعد التخطيط. | docs/architecture/adr/ADR-001-stream-based-rendering-pipeline.md؛ src/Core/Concerns/HasTextOutput.php (writeHtml()). |
writeHtml() يُنشئ تلقائياً أول صفحة عند عدم وجود صفحات. | tests/Unit/Core/Concerns/DocumentTextOutputFontSubsettingAndBorderEdgeCaseTest.php (writeHtmlAutoCreatesFirstPageWhenNoPagesExist). |
output() / save() / getPdfData() هي أفعال الإصدار (لا مرحلتين render/output). | src/Core/Concerns/HasOutput.php (output()، save()، getPdfData())؛ tests/Unit/Core/Concerns/DocumentOutputDestinationDispatchTest.php. |
وجهة الإخراج هي التعداد NextPDF\Contracts\OutputDestination (Inline/Download/File/String). | src/Contracts/OutputDestination.php؛ tests/Unit/Core/Concerns/DocumentOutputDestinationDispatchTest.php. |
| تُكتَب خطوط HTML دائماً على هيئة برامج embedded/subset. | tests/Unit/Core/Concerns/DocumentTextOutputFontSubsettingAndBorderEdgeCaseTest.php (recordUsedCharactersAffectsFontSubsetting)؛ ISO 32000-2 §9 (البيانات الأمامية citations:). |
أدوات ضبط البيانات الوصفية المُصنَّفة (setTitle/setAuthor) تحلّ محلّ addInfo() حرّ الشكل. | src/Core/Concerns/HasMetadata.php (setTitle()، setAuthor())؛ tests/Unit/Core/Concerns/DocumentInfoMetadataSetterBaselineTest.php. |
| مسار HTML من النهاية إلى النهاية (السند القابل للتشغيل لهذا الدليل). | examples/08-html-basic.php؛ مجموعة tests/Unit/Html/ في Core. |
| المسافات البيضاء / فواصل الأسطر خاصة بالمحرك (فرق التخطيط). | CSS Text 3 §6.5 (البيانات الأمامية citations: + المطابقة). |
التراجع
قسم بعنوان «التراجع»بما أن كلتا الحزمتين تبقيان مثبَّتتين حتى التحويل النهائي، فإن التراجع لموضع استدعاء غير مُحوَّل يعني إعادته إلى مسار Dompdf. بعد التحويل النهائي، يعني التراجع استعادة dompdf/dompdf وموضع الاستدعاء السابق من نظام التحكم في الإصدارات. لا يوجد نقل بيانات؛ فقط تغييرات في الشفرة.
اعتبارات الأداء
قسم بعنوان «اعتبارات الأداء»راجع الأداء. يعني نموذج التمريرة الواحدة أن الانتقال لا يُدخِل تكلفة الاحتفاظ بشجرة إطارات. التغيير الرئيسي في تكلفة كل مستند هو الحلّ المُسبق للموارد من الخطوة 5، والذي يمكنك تخزينه مؤقتاً.
المزالق الشائعة
قسم بعنوان «المزالق الشائعة»- ترك
render()في مكانه، مما يسبِّب خطأ طريقة غير معرَّفة فادحاً. - تمرير بايتات غير مُرمَّزة بـ UTF-8 بعد إسقاط
$encoding، مما يسبِّب نصاً مشوَّهاً صامتاً. - توقُّع إخراج مطابق على مستوى البايت أو البكسل من محركين مستقلين. لا يدّعي هذا الدليل أبداً بديلاً جاهزاً للإسقاط أو توافقاً بنسبة %100.
- الاعتماد على قوالب
enable_php، التي يجب إعادة هيكلتها وإزالتها. - معاملة مصفوفة دعم CSS على أنها استشارية. هي المرجع المعتمد للميزات المُتحقَّق منها بشأن ما يجب توقُّعه.