Cconst vs define() in php

refat • منذ سنتين

السلام عليكم
ممكت ترجمة الاجابة هاي https://stackoverflow.com/questions/2447791/define-vs-const

شكرا

كلمات دليلية: oop php

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

الإجابات (1)

عمار الخوالدة • منذ سنتين
مميز

ابتداء من نسخة PHP 5.3 توجد طريقتان لتعريف الثوابت، اما باستخدام الكلمة المحجوزة const او باستخدام الدالة define:

const FOO = 'BAR';
define('FOO', 'BAR');

الفرق الجوهري بين الطريقتين هو أن const تعرف الثوابت أثناء "الترجمة" بينما define تعرفها أثناء تشغيل البرنامج، هذا يسبب معظم سلبيات const، مثال:

  • const لا يمكن ان تستخدم داخل شرط معين، بل يجب ان تستخدم في أعلى scope ( مجال رؤية الثوابت والمتغيرات والدوال، بحيث يمكن الوصول اليها من اي مكان ):
    if (...) {
        const FOO = 'BAR';    // غير ممكن
    }
    
    if (...) {
        define('FOO', 'BAR'); // ممكن
    }

    ما الفائدة من تعريف الثوابت داخل الشروط؟ احدى الفوائد الشائعة لهذا الاستخدام هو التحقق مما اذا كان الثابت قد تم تعريفه بالفعل، مثال:
     

    if (!defined('FOO')) {
        define('FOO', 'BAR');
    }
    

     

  • const تقبل فقط scalar datatype، مثل ( الارقام، النصوص، أو الثوابت الأخرى مثل true, false, null, __FILE__)، بينما define تقبل أي تعبير ( هذا الفرق بين const و define كان موجودا قبل الاصدار 5.6 ):
    const BIT_5 = 1 << 5;    // يعمل فقط منذ الاصدار 5.6 فما فوق
    define('BIT_5', 1 << 5); // يعمل
    

     

  •  const تأخذ اسماء ثابتة  عند تعريفها، بينما define (بما انها تستقبل الاسم كنص) تتستقبل أي تعبير كاسم:
    for ($i = 0; $i < 32; ++$i) {
        define('BIT_' . $i, 1 << $i);
    }

     

  •  const بطبيعتها Case Sensitive ( حالة الاحرف مهمة وحساسة ) بينما define تعطيك خيارا للسماح بتعريف ثابت غير حساس لحالة الأحرف:
    define('FOO', 'BAR', true);
    echo FOO; // BAR
    echo foo; // BAR
    

     

 تلك كانت الجوانب السلبية، الآن سنوضح الأسباب التي تجعلني شخصيا ( كاتب الاجابة وليس أنا 😄 ) استخدم const دائما باستثناء الحالات السابقة الذكر:

  • const اوضح للقراءة لأنها جزء من اللغة وليست دالة، وهي تتناسق مع طريقة تعريف الثوابت في الكلاسات.
  • -- لم افهم ما يقصد بالنقطة الثانية بالضبط --
  • const تعرف الثابت في الـ namespace الحالية تلقائيا، بينما define تحتاج أن تحدد لها اسم الـ namespace بالكامل:
     
    namespace A\B\C;
    // To define the constant A\B\C\FOO:
    const FOO = 'BAR';
    define('A\B\C\FOO', 'BAR');
    

     

  • ابتداء من PHP 5.6 فـ const يمكن أيضا ان تكون عبارة عن مصفوفة array، بينما define لا تدعم ذلك. ( اصبح ذلك مدعوما فيها منذ الاصدار PHP 7 ).

 

وأخيرا، لاحظ أن const يمكن استخدامها بداخل class أو interface في الـ global scope، بينما ذلك غير ممكن باستخدام define:
 

class Foo {
    const BAR = 2; // valid
}
// but
class Baz {
    define('QUX', 2); // invalid
}

 

الخلاصة:
استخدم دائما const الا في حال احتجت تعريف المتغير بداخل شرط مثلا، فقابلية قراءة الكود أفضل باستخدامها.

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !