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() فقط للثوابت العامة. داخل الفئة