قسِّم موقعك إلى ملفات قابلة لإعادة الاستخدام باستخدام include و require، مع بنية مشروع واضحة وثوابت مركزية.
افتح هذا الدرس في Kodokonحالما يتجاوز موقعك صفحتين، يصبح تكرار الترويسة والتذييل والدوال في كل ملف أمرًا يصعب التحكم فيه. توفر PHP أربع تعليمات للتضمين: include، وrequire، ونسختيهما include_once / require_once. وكلها تُدرِج محتوى ملف عند نقطة الاستدعاء؛ ويكمن الفرق في معالجة الأخطاء والتضمينات المتكررة. تتعقّب نسختا _once الملفات التي جرى تحميلها من قبل وتُضمّنها مرة واحدة فقط - وهذا ضروري لملفات الدوال التي لا يمكن التصريح بها مرتين.
<?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, '.', ',') . ' €';
}تساوي بنية المشروع الواضحة ألف تعليق توضيحي. من الأعراف الشائعة: يحتوي public/ على الصفحات المُقدَّمة للمتصفح (وهو المجلد الوحيد المكشوف)، ويجمع src/ الإعدادات والدوال، ويحتوي templates/ على أجزاء الصفحات (header.php، footer.php). ويُشغَّل خادم التطوير المدمج في PHP بتوجيهه إلى public/.
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
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');عندئذٍ تصبح كل صفحة عملية تجميع قصيرة: حمِّل الإعدادات والدوال باستخدام require، ثم ضمِّن القوالب حول المحتوى الخاص بالصفحة.
<?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'; ?>