PHP में define() vs const: कॉन्स्टेंट घोषित करने की जंग
\n\nक्या आपने कभी सोचा है कि PHP में कॉन्स्टेंट घोषित करने के दो तरीके क्यों हैं? ऐसा लगता है कि अनावश्यक चीज़ें बढ़ा दी गई हैं, है न? लेकिन असल में, बात छोटी-छोटी डिटेल्स में छिपी है। यह सवाल Stack Overflow पर हज़ारों बार देखा गया है, और इसकी वजह है — define() और const के बीच का अंतर आपके कोड की आर्किटेक्चर को गंभीर रूप से प्रभावित कर सकता है।
आज हम हमेशा के लिए इस उलझन को सुलझा लेंगे। आप न सिर्फ़ सिंटैक्स के अंतर को समझेंगे, बल्कि यह भी जानेंगे कि कब कौन सा टूल आपको असली फ़ायदा देता है। चलिए शुरू करते हैं!
\n\nसंक्षिप्त परिचय: PHP में कॉन्स्टेंट क्या है?
\n\nकॉन्स्टेंट एक सरल वैल्यू के लिए एक पहचानकर्ता (identifier) है। इसकी मुख्य खासियत: स्क्रिप्ट के निष्पादन के दौरान इसकी वैल्यू बदली नहीं जा सकती (वेरिएबल के विपरीत)। डिफ़ॉल्ट रूप से, कॉन्स्टेंट केस-सेंसिटिव होते हैं, लेकिन इसे बदला जा सकता है (स्पॉयलर: define() के साथ)।
एक क्लासिक कॉन्स्टेंट का उदाहरण:
\n\n<?php\ndefine("MAX_UPLOAD_SIZE", 10485760); // 10 MB बाइट्स में\necho MAX_UPLOAD_SIZE; // 10485760\n?>\n\nवही चीज़, लेकिन const के साथ:
<?php\nconst MAX_UPLOAD_SIZE = 10485760;\necho MAX_UPLOAD_SIZE;\n?>\n\nदेखने में एक जैसा लगता है। लेकिन गहराई में जाएँ तो बहुत कुछ अलग है।
\n\ndefine() और const के मुख्य अंतर
\n\nचलिए सब कुछ साफ़-साफ़ समझते हैं। यहाँ वे मुख्य अंतर हैं जो हर PHP डेवलपर को पता होने चाहिए।
\n\n1. घोषणा का समय: कंपाइलेशन बनाम रनटाइम
\n\nयह सबसे बुनियादी अंतर है।
\n\n- \n
const— कंपाइलेशन के समय घोषित होता है। इसका मतलब है कि आपconstका उपयोग लूप, कंडीशन या फंक्शन के अंदर नहीं कर सकते। इसे क्लास के 'बॉडी' (क्लास कॉन्स्टेंट के लिए) या ग्लोबल स्कोप में ही घोषित करना होगा। \n define()— रनटाइम पर निष्पादित होता है। आप इसे कहीं भी रख सकते हैं:if,for,whileके अंदर, यहाँ तक कि फंक्शन में भी (हालाँकि यह अच्छी प्रैक्टिस नहीं है)। \n
एक उदाहरण जो const के साथ काम नहीं करेगा:
<?php\nif (PHP_OS === 'WINNT') {\n const PLATFORM = 'Windows';\n // Fatal error: Cannot use const in control structure\n}\n?>\n\nलेकिन define() के साथ यह चलेगा:
<?php\nif (PHP_OS === 'WINNT') {\n define('PLATFORM', 'Windows');\n echo PLATFORM; // Windows\n}\n?>\n\n2. डेटा प्रकार: ऐरे और ऑब्जेक्ट
\n\nलंबे समय तक, define() केवल स्केलर टाइप (स्ट्रिंग, नंबर, बूलियन) को सपोर्ट करता था। PHP 7 से शुरू करके, define() ऐरे के साथ भी काम करने लगा।
const भी ऐरे को सपोर्ट करता है (PHP 5.6 से), लेकिन यह ऑब्जेक्ट या एक्सप्रेशन को सपोर्ट नहीं करता:
<?php\n// PHP 7+ से काम करता है\ndefine('FRUITS', ['apple', 'banana', 'cherry']);\necho FRUITS[1]; // banana\n\n// यह भी काम करता है (PHP 5.6+)\nconst COLORS = ['red', 'green', 'blue'];\n\n// लेकिन यह एरर देगा!\n// const RESULT = 2 + 3; // यह काम करेगा, क्योंकि यह कॉन्स्टेंट एक्सप्रेशन है\n// const DYNAMIC = rand(1, 10); // एरर! कॉन्स्टेंट एक्सप्रेशन नहीं है\n?>\n\nमहत्वपूर्ण: define() फंक्शन के रिजल्ट का उपयोग कर सकता है (define('SITE_NAME', get_site_name())), जबकि const केवल कॉन्स्टेंट एक्सप्रेशन (नंबर, स्ट्रिंग, अन्य कॉन्स्टेंट) को ही स्वीकार करता है।
3. नेमस्पेस और स्कोप
\n\nयहाँ एक सूक्ष्म लेकिन महत्वपूर्ण बारीकी है।
\n\n- \n
define()— हमेशा एक ग्लोबल कॉन्स्टेंट बनाता है। भले ही आप इसे नेमस्पेस के अंदर कॉल करें, कॉन्स्टेंट हर जगह से एक्सेस किया जा सकेगा। \n const— नेमस्पेस के नियमों का पालन करता है।MyApp\\Configनेमस्पेस में घोषित कॉन्स्टेंट का नामMyApp\\Conहोगा।