الثوابت وملفات التضمين
الثوابت هي قيم لا تتغير أبدًا. كلمات مرور قواعد البيانات، ومفاتيح واجهة برمجة التطبيقات (API)، وأسماء المواقع — أي بيانات تظل ثابتة طوال فترة تنفيذ البرنامج يجب أن تكون ثابتة، وليس متغيرًا. كما يعلّمك هذا الدرس كيفية تقسيم الكود إلى ملفات متعددة باستخدام
includeوrequire.
1. define() مقابل const
يوفر لغة PHP طريقتين لإعلان الثوابت:
<?php
// define() — declared at runtime (can be used anywhere)
define("SITE_NAME", "My Blog");
define("MAX_UPLOAD_SIZE", 5 * 1024 * 1024); // 5MB
define("DB_HOST", "localhost");
// const — declared at compile time (global scope only)
const APP_VERSION = "2.0.0";
const PI = 3.14159;
echo SITE_NAME; // My Blog (note: no $ prefix)
echo APP_VERSION; // 2.0.0
?>
define() |
const |
|
|---|---|---|
| أين | في أي مكان (داخل الدوال/الشروط) | النطاق العام فقط |
| التوقيت | وقت التشغيل | وقت التحويل البرمجي (أسرع قليلاً) |
| المصفوفات | ✅ PHP 7+ | ✅ PHP 5.6+ |
| التعبيرات | ✅ | ❌ القيم البسيطة فقط |
| الأنسب لـ | التهيئة، التعريفات الشرطية | ثوابت الفئات |
const — فهو أسرع قليلاً ويُقرأ بوضوح أكبر. لا تستخدم define() إلا عندما تحتاج إلى قيمة محسوبة ديناميكيًا أو عندما تحتاج إلى تعريف ثابت داخل دالة أو كتلة شرطية.
(1) قواعد تسمية الملفات
تُكتب الثوابت بأحرف كبيرة فقط مع استخدام خطوط سفلية (SCREAMING_SNAKE_CASE):
<?php
const MAX_LOGIN_ATTEMPTS = 5;
const DEFAULT_LANGUAGE = "en-US";
const API_BASE_URL = "https://api.example.com/v1";
?>
(2) التحقق من وجود ثابت
<?php
if (!defined("SITE_NAME")) {
define("SITE_NAME", "Default Site Name");
}
// defined() checks whether a constant is already set
?>
2. الثوابت السحرية
توفر لغة PHP مجموعة من «الثوابت السحرية» التي تتغير قيمها تلقائيًا حسب المكان الذي تُستخدم فيه:
<?php
// Assume the file path is: C:\xampp\htdocs\myphp\demo.php
echo __LINE__; // Current line number: 7
echo __FILE__; // Full file path: C:\xampp\htdocs\myphp\demo.php
echo __DIR__; // Directory of the file: C:\xampp\htdocs\myphp
echo __FUNCTION__; // Current function name (inside a function)
echo __CLASS__; // Current class name (inside a class)
echo __METHOD__; // Current method name (inside a method)
echo __NAMESPACE__; // Current namespace
?>
▶ مثال: المسارات الموثوقة باستخدام __DIR__
<?php
// ❌ Fragile relative path
$config = include "config.php";
// ✅ Always resolves to the correct absolute path
$config = include __DIR__ . "/config.php";
$avatar = __DIR__ . "/uploads/avatars/" . $userId . ".jpg";
?>
__DIR__ هو الثابت السحري الذي ستستخدمه أكثر من غيره في أعمال التطوير اليومية. استخدم دائمًا __DIR__ لإنشاء المسارات في ملفات التضمين الخاصة بك — فهذا يضمن العثور على الملف بغض النظر عن الدليل الذي يتم استدعاء البرنامج النصي منه.
3. include مقابل require
قسّم الكود الخاص بك إلى ملفات متعددة واستدعِها باستخدام include أو require:
<?php
// config.php
const DB_HOST = "localhost";
const DB_NAME = "myapp";
?>
<?php
// index.php
require __DIR__ . "/config.php";
echo "Database host: " . DB_HOST; // Constants are now available
?>
include |
require |
|
|---|---|---|
| لم يتم العثور على الملف | ⚠️ تحذير، يستمر البرنامج النصي | 🔴 خطأ فادح، يتوقف البرنامج النصي |
| إعادة الاستخدام | يمكن إدراجه عدة مرات | يمكن إدراجه عدة مرات |
| الأنسب لـ | محتوى اختياري | الإعدادات الأساسية ومكتبات الوظائف |
require بشكل افتراضي. إذا كان ملف التكوين أو مكتبة الوظائف مفقودًا، فيجب أن يتوقف البرنامج النصي على الفور بدلاً من الاستمرار في العمل بمنطق معطوب. احتفظ بـ include للعناصر الاختيارية حقًّا مثل لافتات الإعلانات أو مقتطفات التحليلات.
(1) include_once و require_once
منع تحميل الملف نفسه أكثر من مرة واحدة:
<?php
require_once __DIR__ . "/config.php";
require_once __DIR__ . "/config.php"; // Second call does nothing
?>
require_once للملفات التي تُعرِّف الدوال أو الفئات (إعادة تعريفها قد يتسبب في حدوث خطأ فادح). استخدم require العادي لأجزاء قوالب HTML التي قد ترغب في تضمينها عدة مرات عن قصد.
4. الثوابت المُحدَّدة مسبقًا
يأتي لغة PHP مزودًا بعدد من الثوابت العالمية المدمجة:
<?php
echo PHP_VERSION; // 8.2.7
echo PHP_INT_MAX; // 9223372036854775807 (64-bit)
echo PHP_INT_MIN; // -9223372036854775808
echo PHP_FLOAT_MAX; // 1.7976931348623E+308
echo PHP_EOL; // Line break (\n or \r\n depending on OS)
echo DIRECTORY_SEPARATOR; // \ (Windows) or / (Unix)
echo PATH_SEPARATOR; // ; (Windows) or : (Unix)
?>
وهي مفيدة بشكل خاص لكتابة كود يعمل على منصات متعددة.
5. التطوير المعياري في الممارسة العملية
قم بتنظيم موقعك في ملفات متعددة مجمعة معًا باستخدام require:
myphp/
├── config.php ← Database config, constants
├── functions.php ← Shared functions
├── header.php ← Page header HTML
├── footer.php ← Page footer HTML
├── index.php ← Home page
└── about.php ← About page
▶ مثال: صفحة معيارية
<?php
// header.php
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><?= $pageTitle ?? "My Website" ?></title>
</head>
<body>
<header>
<h1><?= SITE_NAME ?></h1>
<nav>
<a href="/">Home</a>
<a href="about.php">About</a>
</nav>
</header>
<main>
<?php
// footer.php
?>
</main>
<footer>
<p>© <?= date("Y") ?> <?= SITE_NAME ?></p>
</footer>
</body>
</html>
<?php
// about.php
define("SITE_NAME", "My Blog");
$pageTitle = "About Us";
require __DIR__ . "/header.php";
?>
<h2>About Us</h2>
<p>We're a team passionate about technology.</p>
<?php
require __DIR__ . "/footer.php";
?>
@include و@extends و@section في Blade تمثل التطور الحديث لهذه الفكرة بالذات.
❓ أسئلة شائعة
const أم define()؟const للثوابت العالمية البسيطة — فهي أسرع وأكثر إيجازًا. استخدم define() عندما تحتاج إلى قيمة تُحسب في وقت التشغيل أو تحتاج إلى التعريف داخل شرط أو دالة. داخل الفئة، لا يعمل سوى const.include أم require — أيهما؟require. وينبغي أن يؤدي فقدان ملفات التكوين ومكتبات الوظائف إلى ظهور خطأ فوري. أما الحالات التي تستدعي استخدام include فهي نادرة — مثل المحتوى الاختياري مثل مواقع الإعلانات أو مقتطفات التحليلات، حيث يجب أن تظل الصفحة تعمل بدونها.require رغم أن الملف موجود بالتأكيد؟echo __DIR__ . "/config.php" للتأكد من المسار الكامل الذي يتم إنشاؤه. تذكر أن المسارات النسبية تكون بالنسبة إلى دليل العمل الحالي، وليس دليل البرنامج النصي — ولهذا السبب يُعد __DIR__ الطريقة الأكثر أمانًا لإنشاء المسارات.📖 ملخص
const(عالمي، سريع) وdefine()(ديناميكي) هما الطريقتان المتبعتان لإعلان الثوابت- تستخدم الأسماء الثابتة
SCREAMING_SNAKE_CASEدون البادئة$ - الثوابت السحرية:
__DIR__(الدليل)،__FILE__(مسار الملف)،__LINE__(رقم السطر) requireيتسبب في حدوث خطأ فادح عند عدم وجود الملف؛ أماincludeفيكتفي بإصدار تحذير__DIR__هي الطريقة الأكثر موثوقية لإنشاء مسارات الملفاتrequire_onceيمنع التحميل المكرر لتعريفات الدوال/الفئات
📝 تمارين
- أنشئ ملف
config.phpيحدد الثوابت الخاصة باسم الموقع، ومضيف قاعدة البيانات، ومسار دليل التحميل. ثم قم باستدعاء هذا الملفrequireمن صفحة PHP أخرى واستخدم الثوابت لعرض إعداداتك. - قسّم صفحة المدونة إلى
header.phpوfooter.phpوindex.php. استخدم__DIR__لإنشاء جميع إشارات المسار في عباراتrequireالخاصة بك. - اكتب كودًا يستخدم
defined()للتحقق مما إذا كان الثابت قد تم تعريفه أم لا، وقم بتعيين قيمة افتراضية في حالة عدم تعريفه.



