Elvis vs Null Coalescing: क्या है असली फर्क? (PHP के अंदर की बात)
\n\nनमस्ते, दोस्त! अगर आपने कभी PHP में कोड लिखा है, तो आपने ज़रूर ऐसी स्थिति देखी होगी जहाँ आपको चेक करना होता है कि वेरिएबल मौजूद है या नहीं। अगर है, तो उसकी वैल्यू लो, नहीं तो कोई डिफ़ॉल्ट वैल्यू दिखाओ। ये काम आसान लगता है, लेकिन यहीं पर नए डेवलपर (और कभी-कभी एक्सपर्ट भी) दो बहुत ही समान, लेकिन बिल्कुल अलग ऑपरेटरों के बीच फंस जाते हैं: short-ternary (Elvis operator) ?: और null coalescing operator ??।
यह Stack Overflow पर सबसे पॉपुलर सवालों में से एक है (हज़ारों व्यूज़ और वोट्स)। और ये सिर्फ़ एकेडमिक बात नहीं है। गलत ऑपरेटर चुनने पर ऐसे बग आ सकते हैं जिन्हें पकड़ने में आपको घंटों लग जाएँगे। तो चलिए, आज ही हमेशा के लिए समझ लेते हैं कि इनके अंदर क्या चलता है और कब किसका इस्तेमाल करना चाहिए।
\n\nपहले एक छोटी सी शुरुआत: हमें इन ऑपरेटरों की ज़रूरत क्यों है?
\n\nमान लीजिए, आप यूज़र का नाम दिखाने के लिए कोड लिख रहे हैं। अगर नाम नहीं है, तो 'गेस्ट' दिखाना है। सबसे आम तरीका है if का इस्तेमाल:
if (isset($userName)) {\n $displayName = $userName;\n} else {\n $displayName = 'गेस्ट';\n}\n\nयह तो काम करता है, लेकिन बहुत लंबा है। PHP में इसके लिए शॉर्टकट मौजूद हैं। और यहीं पर हम मुख्य दुविधा में पड़ते हैं: ?: या ??? पहली नज़र में दोनों एक जैसे लगते हैं। लेकिन ऐसा है नहीं।
1. Elvis Operator (?:) — 'बूलियन वैल्यूज़ का बादशाह'
\n\nElvis ऑपरेटर (इसका नाम रॉक एंड रोल के बादशाह एल्विस प्रेस्ली के हेयरस्टाइल से मिलता है: ?: — आँखें, नाक और बाल) PHP के वर्जन 5.3 में आया था। यह टर्नरी ऑपरेटर का छोटा रूप है।
सिंटैक्स:
\n$result = $expression ?: $default;\n\nइसका मतलब क्या है? इंटरप्रेटर $expression को देखता है। अगर वह true में बदल जाता है (यानी 'फाल्स' वैल्यू नहीं है), तो $expression की वैल्यू लौटा दी जाती है। अगर $expression 'फाल्स' है (false, 0, खाली स्ट्रिंग, null, खाली array, आदि), तो $default लौटाया जाता है।
एक ज़रूरी बात: Elvis operator यह चेक नहीं करता कि वेरिएबल मौजूद है या नहीं। वह सिर्फ़ उसकी सच्चाई (truthiness) चेक करता है। अगर वेरिएबल डिफ़ाइन ही नहीं है, तो आपको Notice: Undefined index/variable एरर मिलेगी।
\n\nएक पेचीदा उदाहरण:
\n$count = 0;\n$result = $count ?: 10;\necho $result; // 10 प्रिंट होगा, 0 नहीं!\n\nऐसा क्यों? क्योंकि 0 एक 'फाल्स' वैल्यू (falsy) है। Elvis ने समझा कि वेरिएबल 'खाली' है, और डिफ़ॉल्ट वैल्यू दे दी। कई डेवलपर्स के लिए यह एक सरप्राइज़ होता है।
2. Null Coalescing Operator (??) — 'Notice से बचाने वाला'
\n\nNull coalescing ऑपरेटर PHP 7.0 में आया और सभी ने इसे बहुत पसंद किया। इसकी सबसे बड़ी खासियत यह है कि यह गैर-मौजूद वेरिएबल्स के साथ भी सुरक्षित रूप से काम करता है, बिना कोई एरर दिए।
\n\nसिंटैक्स:
\n$result = $expression ?? $default;\n\nइसका मतलब क्या है? यह ऑपरेटर चेक करता है कि $expression मौजूद है और वह null के बराबर नहीं है। अगर हाँ, तो $expression लौटाता है। नहीं तो $default लौटाता है।
सबसे बड़ा अंतर: ?? सिर्फ़ null और undefined को छोड़कर बाकी सभी 'फाल्स' वैल्यूज़ (0, "", false) को वैलिड मानता है और उन्हीं को लौटाता है।
उदाहरण:
\n$count = 0;\n$result = $count ?? 10;\necho $result; // 0 प्रिंट होगा! क्योंकि वेरिएबल मौजूद है और null नहीं है।\n\nफर्क समझ में आया? यही दोनों ऑपरेटरों के 'अंदर' का मुख्य मैकेनिज़्म है।
\n\n3. 'अंदर की' तुलना: सच्चाई की तालिका
\n\nचलिए, इसे एक साफ़ तालिका में समझ लेते हैं ताकि बात पक्की हो जाए। मान लीजिए कि