PHP में Short-ternary और Null Coalescing ऑपरेटर: पूरी तुलना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

एल्विस कौन है और PHP से इसका क्या संबंध?

\n\n

अगर आपने कभी PHP में कोड लिखा है, तो आपने दूसरों के कोड में अजीब-सी चीज़ें ज़रूर देखी होंगी: $name ?: 'अतिथि' या $name ?? 'अतिथि'। पहली नज़र में ये एक जैसी लगती हैं। लेकिन असल में, इन दोनों ऑपरेटरों के पीछे बिल्कुल अलग-अलग मैकेनिज़्म छिपे हैं, जो आपके कोड को बचा भी सकते हैं और मुश्किल में भी डाल सकते हैं।

\n\n

Stack Overflow पर सवाल "PHP short-ternary ("Elvis") operator vs null coalescing operator" को हज़ारों बार देखा जा चुका है। और यह कोई संयोग नहीं है। डेवलपर्स अक्सर इनमें भ्रमित हो जाते हैं, गलतियाँ करते हैं, और फिर बग्स ढूंढने में घंटों लगा देते हैं। आइए, एक बार और हमेशा के लिए समझ लें कि कौन क्या है, और अनुमान लगाना बंद करें।

\n\n

इस लेख में हम सिर्फ अंतर नहीं बताएंगे। हम PHP के अंदरूनी कामकाज में झांकेंगे, प्रोडक्शन के रियल केस देखेंगे, और समझेंगे कि कब किस ऑपरेटर का उपयोग करना चाहिए। चलिए शुरू करते हैं!

\n\n

त्वरित परिचय: ये क्या चीज़ें हैं?

\n\n

टर्नरी ऑपरेटर (क्लासिक)

\n

पहले बेसिक समझ लेते हैं। टर्नरी ऑपरेटर if-else का छोटा रूप है:

\n\n
$age = 20;\n$status = ($age >= 18) ? 'वयस्क' : 'बच्चा';\n// $status = 'वयस्क'
\n\n

बहुत सरल: अगर शर्त सही (true) है तो पहला मान लें, नहीं तो दूसरा।

\n\n

Short-ternary (उर्फ Elvis operator) — ?:

\n

यह उस स्थिति के लिए शॉर्टकट है जब आप किसी वेरिएबल को "सत्यता" (truthy) के लिए जांच रहे हैं और उसी वेरिएबल का मान उपयोग करना चाहते हैं:

\n\n
$name = 'राहुल';\n$greeting = $name ?: 'अतिथि';\n// $greeting = 'राहुल'\n\n$name = '';\n$greeting = $name ?: 'अतिथि';\n// $greeting = 'अतिथि'
\n\n

यह ऐसे काम करता है: अगर $name को true में बदला जा सकता है, तो $name लें। नहीं तो "अतिथि"।

\n\n

Null coalescing operator — ??

\n

यह PHP 7.0 में आया और तुरंत डेवलपर्स का पसंदीदा बन गया:

\n\n
$name = 'राहुल';\n$greeting = $name ?? 'अतिथि';\n// $greeting = 'राहुल'\n\n$name = null;\n$greeting = $name ?? 'अतिथि';\n// $greeting = 'अतिथि'
\n\n

एल्विस से अंतर: यह जांच सिर्फ null पर करता है, न कि पूरी "झूठ" (falsy) पर।

\n\n

मुख्य अंतर: किसे "खाली" माना जाता है?

\n\n

यहाँ से असली मज़ा शुरू होता है। आइए, विभिन्न $value मानों के लिए तुलना तालिका देखें:

\n\n
$value = false;\necho $value ?: 'default'; // 'default' (false — यह "झूठ" है)\necho $value ?? 'default'; // false (false — यह null नहीं है)\n\n$value = 0;\necho $value ?: 'default'; // 'default' (0 — यह "झूठ" है)\necho $value ?? 'default'; // 0 (0 — यह null नहीं है)\n\n$value = '';\necho $value ?: 'default'; // 'default' (खाली स्ट्रिंग — यह "झूठ" है)\necho $value ?? 'default'; // '' (खाली स्ट्रिंग — यह null नहीं है)\n\n$value = [];\necho $value ?: 'default'; // 'default' (खाली ऐरे — यह "झूठ" है)\necho $value ?? 'default'; // [] (खाली ऐरे — यह null नहीं है)\n\n$value = '0';\necho $value ?: 'default'; // 'default' (स्ट्रिंग "0" — यह "झूठ" है!)\necho $value ?? 'default'; // '0' (स्ट्रिंग "0" — यह null नहीं है)
\n\n

अंतर देखा? एल्विस "सत्यता" (truthy/falsy) की जांच करता है, जबकि null coalescing सिर्फ अस्तित्व और null से अलग होने की सख्त जांच करता है।

\n\n

अंदरूनी कामकाज: इंजन स्तर पर यह कैसे काम करता है

\n\n

आइए PHP के सोर्स कोड में झांकें (लगभग)। अगर आपने कभी PHP को सोर्स से कंपाइल किया है, तो आप जानते हैं कि दोनों ऑपरेटर पार्सिंग स्टेज पर प्रोसेस होते हैं।

\n\n

Short-ternary (?):

\n

असल में, यह सिंटैक्स शुगर है। $a ?: $b को $a ? $a : $b में बदल दिया जाता है। लेकिन एक बारीकी है: PHP $a को दो बार कैलकुलेट नहीं करता। यह रिजल्ट को एक टेम्परेरी वेरिएबल में सेव कर लेता है। यह साइड इफेक्ट वाले फंक्शन्स के लिए महत्वपूर्ण है:

\n\n
function getData() {\n    echo "फंक्शन कॉल हुआ!\\n";\n    return rand(0, 1) ? 'data' : '';\n}\n\n// एल्विस फंक्शन को सिर्फ एक बार कॉल करेगा\n$result = getData() ?: 'default';\n// "फंक्शन कॉल हुआ!" — सिर्फ एक बार
\n\n

अगर PHP $a को दो बार कैलकुलेट करता, तो फंक्शन दो बार कॉल होता और हर बार अलग रिजल्ट आ सकता था।

ब्लॉग

पुस्तक अनुशंसाएँ