الثوابت وملفات التضمين

الثوابت هي قيم لا تتغير أبدًا. كلمات مرور قواعد البيانات، ومفاتيح واجهة برمجة التطبيقات (API)، وأسماء المواقع — أي بيانات تظل ثابتة طوال فترة تنفيذ البرنامج يجب أن تكون ثابتة، وليس متغيرًا. كما يعلّمك هذا الدرس كيفية تقسيم الكود إلى ملفات متعددة باستخدام include وrequire.

1. define() مقابل const

يوفر لغة PHP طريقتين لإعلان الثوابت:

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
<?php
const MAX_LOGIN_ATTEMPTS = 5;
const DEFAULT_LANGUAGE = "en-US";
const API_BASE_URL = "https://api.example.com/v1";
?>

(2) التحقق من وجود ثابت

PHP
<?php
if (!defined("SITE_NAME")) {
    define("SITE_NAME", "Default Site Name");
}
// defined() checks whether a constant is already set
?>

2. الثوابت السحرية

توفر لغة PHP مجموعة من «الثوابت السحرية» التي تتغير قيمها تلقائيًا حسب المكان الذي تُستخدم فيه:

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
<?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
<?php
// config.php
const DB_HOST = "localhost";
const DB_NAME = "myapp";
?>
PHP
<?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
<?php
require_once __DIR__ . "/config.php";
require_once __DIR__ . "/config.php";  // Second call does nothing
?>
💡 نصيحة: استخدم require_once للملفات التي تُعرِّف الدوال أو الفئات (إعادة تعريفها قد يتسبب في حدوث خطأ فادح). استخدم require العادي لأجزاء قوالب HTML التي قد ترغب في تضمينها عدة مرات عن قصد.


4. الثوابت المُحدَّدة مسبقًا

يأتي لغة PHP مزودًا بعدد من الثوابت العالمية المدمجة:

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:

TEXT
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
<?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
<?php
// footer.php
?>
</main>
<footer>
    <p>&copy; <?= date("Y") ?> <?= SITE_NAME ?></p>
</footer>
</body>
</html>
PHP
<?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";
?>
💡 نصيحة: هذا النهج المعياري هو نمط التصميم الأصلي للغة PHP. عندما تتعلم لارافيل لاحقًا، ستدرك أن توجيهات @include و@extends و@section في Blade تمثل التطور الحديث لهذه الفكرة بالذات.

❓ أسئلة شائعة

س هل يجب عليّ استخدام const أم define()؟
ج استخدم const للثوابت العالمية البسيطة — فهي أسرع وأكثر إيجازًا. استخدم define() عندما تحتاج إلى قيمة تُحسب في وقت التشغيل أو تحتاج إلى التعريف داخل شرط أو دالة. داخل الفئة، لا يعمل سوى const.
س include أم require — أيهما؟
ج الإعداد الافتراضي هو require. وينبغي أن يؤدي فقدان ملفات التكوين ومكتبات الوظائف إلى ظهور خطأ فوري. أما الحالات التي تستدعي استخدام include فهي نادرة — مثل المحتوى الاختياري مثل مواقع الإعلانات أو مقتطفات التحليلات، حيث يجب أن تظل الصفحة تعمل بدونها.
س لماذا تفشل require رغم أن الملف موجود بالتأكيد؟
ج في 99% من الحالات، تكون المشكلة متعلقة بالمسار. قم بتصحيح الخطأ باستخدام: echo __DIR__ . "/config.php" للتأكد من المسار الكامل الذي يتم إنشاؤه. تذكر أن المسارات النسبية تكون بالنسبة إلى دليل العمل الحالي، وليس دليل البرنامج النصي — ولهذا السبب يُعد __DIR__ الطريقة الأكثر أمانًا لإنشاء المسارات.

📖 ملخص

📝 تمارين

  1. أنشئ ملف config.php يحدد الثوابت الخاصة باسم الموقع، ومضيف قاعدة البيانات، ومسار دليل التحميل. ثم قم باستدعاء هذا الملف require من صفحة PHP أخرى واستخدم الثوابت لعرض إعداداتك.
  2. قسّم صفحة المدونة إلى header.php وfooter.php وindex.php. استخدم __DIR__ لإنشاء جميع إشارات المسار في عبارات require الخاصة بك.
  3. اكتب كودًا يستخدم defined() للتحقق مما إذا كان الثابت قد تم تعريفه أم لا، وقم بتعيين قيمة افتراضية في حالة عدم تعريفه.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%