Kodokon kodokon.com

تنظيم كودك: include، والبنية، والثوابت

قسِّم موقعك إلى ملفات قابلة لإعادة الاستخدام باستخدام include و require، مع بنية مشروع واضحة وثوابت مركزية.

7 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

حالما يتجاوز موقعك صفحتين، يصبح تكرار الترويسة والتذييل والدوال في كل ملف أمرًا يصعب التحكم فيه. توفر PHP أربع تعليمات للتضمين: include، وrequire، ونسختيهما include_once / require_once. وكلها تُدرِج محتوى ملف عند نقطة الاستدعاء؛ ويكمن الفرق في معالجة الأخطاء والتضمينات المتكررة. تتعقّب نسختا _once الملفات التي جرى تحميلها من قبل وتُضمّنها مرة واحدة فقط - وهذا ضروري لملفات الدوال التي لا يمكن التصريح بها مرتين.

PHP
<?php

declare(strict_types=1);

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES);
}

function formatPrice(float $amount): string
{
    return number_format($amount, 2, '.', ',') . ' €';
}
src/functions.php: دوال مساعِدة قابلة لإعادة الاستخدام في الموقع بأكمله.

تساوي بنية المشروع الواضحة ألف تعليق توضيحي. من الأعراف الشائعة: يحتوي public/ على الصفحات المُقدَّمة للمتصفح (وهو المجلد الوحيد المكشوف)، ويجمع src/ الإعدادات والدوال، ويحتوي templates/ على أجزاء الصفحات (header.php، footer.php). ويُشغَّل خادم التطوير المدمج في PHP بتوجيهه إلى public/.

BASH
mkdir -p my-site/public my-site/src
mkdir -p my-site/templates
cd my-site
php -S localhost:8000 -t public
إنشاء البنية، ثم تشغيل خادم التطوير.

تستحق القيم الثابتة في المشروع (اسم الموقع، والمسارات، والإعدادات) أن تكون ثوابت بدلًا من متغيرات: فلا يمكن الكتابة فوقها عن طريق الخطأ. يُحَل const وقت التصريف، ويُحَل define() وقت التشغيل؛ ومن الناحية العملية، فضِّل const في ملفات الإعدادات. أما بالنسبة للمسارات، فابدأها دائمًا بـ __DIR__، وهو مجلد الملف الحالي: فستعمل تضميناتك بغض النظر عن المكان الذي يُشغَّل منه السكربت.

PHP
<?php

declare(strict_types=1);

const SITE_NAME = 'La Bonne Pizza';
const ITEMS_PER_PAGE = 12;
const UPLOAD_DIR = __DIR__ . '/../public/uploads';

define('BASE_URL', 'http://localhost:8000');
src/config.php: كل الإعدادات في مكان واحد.

عندئذٍ تصبح كل صفحة عملية تجميع قصيرة: حمِّل الإعدادات والدوال باستخدام require، ثم ضمِّن القوالب حول المحتوى الخاص بالصفحة.

HTML
<?php
require __DIR__ . '/../src/config.php';
require_once __DIR__ . '/../src/functions.php';

$pageTitle = SITE_NAME . ' - Home';
include __DIR__ . '/../templates/header.php';
?>
<main>
  <h1><?= e($pageTitle) ?></h1>
  <p>Pizza of the day: <?= formatPrice(9.5) ?></p>
</main>
<?php include __DIR__ . '/../templates/footer.php'; ?>
public/index.php: أصبحت الصفحة الآن مجرد عملية تجميع.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. ما الفرق بين include و require؟
    • include أسرع من require
    • require تعمل فقط مع المسارات المطلقة
    • توقف require السكربت مع خطأ فادح إذا كان الملف مفقودًا، بينما تُطلق include تحذيرًا وتستمر
    • لا فرق، فهما اسمان مترادفان
  2. ما الغرض من require_once؟
    • ضمان تضمين ملف مرة واحدة فقط، حتى لو طلبته عدة ملفات
    • تضمين ملف في بيئة الإنتاج فقط
    • تضمين ملف دون تنفيذ كود PHP الخاص به
  3. لماذا تبدأ مسارات التضمين بـ __DIR__؟
    • إنه أمر إلزامي منذ PHP 8
    • يصبح المسار نسبيًا إلى الملف الحالي ولم يعد يعتمد على المجلد الذي يُشغَّل منه السكربت
    • يُفعّل ذاكرة تخزين مؤقت للملفات المُضمَّنة