define() مقابل const في PHP: دليل شامل مع أمثلة
\n\nيواجه كل مطور PHP عاجلاً أم آجلاً السؤال: ما هي أفضل طريقة لتعريف ثابت — باستخدام define() أم الكلمة المفتاحية const؟ للوهلة الأولى، لا يوجد فرق تقريباً. كلا الخيارين ينشئان قيمة غير قابلة للتغيير. لكن الشيطان، كما هو الحال دائماً، يكمن في التفاصيل.
هذه المقالة ليست مقتطفاً مملاً من الدليل. سنحلل حالات حقيقية حيث ينجح أحد الأساليب ويفشل الآخر. ستتعلم كيفية تعريف الثوابت بشكل صحيح في PHP 7 و PHP 8، وستكون قادراً على كتابة كود أنظف وأكثر قابلية للتوقع.
\n\nهل أنت مستعد؟ لنذهب!
\n\nما هو الثابت في PHP؟
\n\nقبل المقارنة، دعنا نتذكر الأساسيات. الثابت هو معرف (اسم) لقيمة بسيطة. خاصيته الرئيسية: لا يمكن تغيير القيمة أو حذفها أثناء تنفيذ السكريبت.
\n\nالثوابت ملائمة لتخزين الإعدادات، مسارات الملفات، مفاتيح API، وغيرها من البيانات الثابتة.
\n\n<?php\n// تعريف ثابت باستخدام define()\ndefine('SITE_NAME', 'PythonLib');\n\n// تعريف ثابت باستخدام const\nconst SITE_URL = 'https://pythonlib.ru';\n\necho SITE_NAME; // PythonLib\necho SITE_URL; // https://pythonlib.ru\n?>\n\nكلا الطريقتين تعملان. لكن دعنا نتعمق أكثر.
\n\nالاختلافات الرئيسية بين define() و const
\n\n1. وقت التعريف
\n\nهذه هي النقطة الأكثر أهمية. const هي بنية لغوية تتم معالجتها في وقت الترجمة (قبل تنفيذ السكريبت). define() هي دالة يتم تنفيذها في وقت التشغيل (أثناء تنفيذ السكريبت).
ماذا يعني هذا عملياً؟
\n\n- \n
constيمكن استخدامها فقط لتعريف الثوابت في المستوى الأعلى من السكريبت أو داخل كلاس. لا يمكنك وضعconstداخل حلقةfor، أو شرطif، أو دالة. \n define()يمكن استدعاؤها في أي مكان: داخل حلقة، شرط، أو دالة. هذا يوفر مرونة. \n
<?php\n// هذا سيعمل\nif (true) {\n define('DB_HOST', 'localhost');\n}\n\n// هذا سيسبب خطأ فادحاً\nif (true) {\n // const DB_HOST = 'localhost'; // خطأ!\n}\n\n// لكن const يمكن استخدامها داخل كلاس\nclass Config {\n const DB_NAME = 'test';\n}\n?>\n\nالخلاصة: إذا كنت بحاجة إلى تعريف ثابت بشكل ديناميكي (على سبيل المثال، اعتماداً على شرط أو داخل دالة)، اختر define().
2. أنواع البيانات
\n\nفي PHP 7 و 8، define() تدعم أنواع بيانات أكثر من const.
- \n
constيمكنها فقط قبول القيم العددية (int، float، string، bool، null) و المصفوفات (منذ PHP 5.6). \n define()منذ PHP 7 تدعم أيضاً المصفوفات، وفي PHP 8 — حتى الكائنات (على الرغم من أن هذه حالة نادرة). \n
<?php\n// const يمكنها تخزين مصفوفة (منذ PHP 5.6)\nconst FRUITS = ['apple', 'banana', 'cherry'];\n\n// define() يمكنها ذلك أيضاً (منذ PHP 7)\ndefine('VEGETABLES', ['carrot', 'potato']);\n\n// لكن كائن — فقط عبر define() (PHP 8+)\n// const OBJECT = new stdClass(); // خطأ!\ndefine('MY_OBJECT', new stdClass()); // يعمل\n?>\n\nالخلاصة: بالنسبة لمعظم المهام، كلا الخيارين مناسب. لكن إذا كنت بحاجة إلى تخزين كائن — فقط define().
3. السياق: الثوابت العامة مقابل ثوابت الكلاس
\n\nconst هي أداة عالمية. يمكن استخدامها خارج الكلاسات (ثوابت عامة) وداخل الكلاسات (ثوابت كلاس).
define() مخصصة فقط للثوابت العامة. داخل كلاس