«تعذر العثور على ملف تعريف»: كيفية جعل TypeScript متوافقًا مع أي وحدة JS

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

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

المدونات

توصيات الكتب