define() مقابل const في PHP: ماذا تختار في 2024 (+كود)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

define() مقابل const في PHP: دليل شامل مع أمثلة

\n\n

كل مطور PHP يواجه عاجلاً أم آجلاً السؤال: كيف تعلن عن ثابت بشكل أفضل - باستخدام define() أم الكلمة المفتاحية const؟ للوهلة الأولى، لا يوجد فرق تقريباً. كلا الخيارين ينشئان قيمة غير قابلة للتغيير. لكن الشيطان، كما هو الحال دائماً، يكمن في التفاصيل.

\n\n

هذه المقالة ليست مقتطفاً مملاً من الدليل. سنحلل حالات واقعية حيث يفوز أحد الأساليب بينما يخذل الآخر. ستتعلم كيفية الإعلان عن الثوابت بشكل صحيح في 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\n

1. وقت التعريف

\n\n

هذه هي النقطة الأكثر أهمية. const هي بنية لغوية تتم معالجتها في مرحلة التجميع (قبل تنفيذ السكريبت). define() هي دالة يتم تنفيذها في وقت التشغيل (أثناء تنفيذ السكريبت).

\n\n

ماذا يعني هذا عملياً؟

\n\n
    \n
  • const يمكن استخدامها فقط للإعلان عن الثوابت على المستوى الأعلى من السكريبت أو داخل الفئة. لا يمكنك وضع const داخل حلقة for أو شرط if أو دالة.
  • \n
  • define() يمكن استدعاؤها في أي مكان: داخل حلقة، شرط، دالة. هذا يعطي مرونة.
  • \n
\n\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().

\n\n

2. أنواع البيانات

\n\n

في PHP 7 و 8 define() تدعم أنواع بيانات أكثر من const.

\n\n
    \n
  • const يمكنها قبول القيم العددية فقط (int, float, string, bool, null) و المصفوفات (بدءاً من PHP 5.6).
  • \n
  • define() مع PHP 7 تدعم أيضاً المصفوفات، وفي PHP 8 حتى الكائنات (لكن هذه حالة نادرة).
  • \n
\n\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().

\n\n

3. السياق: الثوابت العامة مقابل ثوابت الفئات

\n\n

const أداة متعددة الاستخدامات. يمكن استخدامها خارج الفئات (ثوابت عامة) وداخل الفئات (ثوابت فئات).

\n\n

define() فقط للثوابت العامة. داخل الفئة

المدونات

توصيات الكتب