परिचय: वह जाल जिसमें हर नौसिखिया फंसता है
\n\nएक स्थिति की कल्पना करें: आप अपनी पहली PHP स्क्रिप्ट लिख रहे हैं, जाँच रहे हैं कि उपयोगकर्ता ने सही पासवर्ड डाला है या नहीं, और आप शर्त लगाते हैं if ($password == "secret")। सब कुछ ठीक काम करता है। लेकिन एक महीने बाद आपको अजीब व्यवहार दिखता है: if (0 == "off") true लौटाता है, जबकि ये दो पूरी तरह से अलग चीज़ें हैं। हैरानी हुई?
PHP तुलना ऑपरेटरों की दुनिया में आपका स्वागत है। यहाँ डबल इक्वल (==) और ट्रिपल इक्वल (===) सिर्फ अलग-अलग चिह्न नहीं हैं, बल्कि तुलना करने के दो बिल्कुल अलग तरीके हैं। अगर आप अंतर नहीं समझते, तो आपका कोड अप्रत्याशित व्यवहार कर सकता है, और बग वहाँ छिपे रहेंगे जहाँ आप उन्हें कम से कम उम्मीद करते हैं।
\n\nइस लेख में हम जानेंगे:
\n- \n
- प्रत्येक ऑपरेटर 'अंदर से' कैसे काम करता है \n
- क्यों
"123abc" == 123true है, जबकि"123abc" === 123false है \n - कौन से जाल आपका इंतजार कर रहे हैं (चेतावनी: बहुत सारे हैं) \n
- वास्तविक प्रोजेक्ट्स में कब किस ऑपरेटर का उपयोग करें \n
तैयार हैं? चलिए शुरू करते हैं!
\n\n1. मूल बातें: PHP में == और === क्या हैं?
\n\nदोनों ऑपरेटर दो मानों की तुलना करने के लिए उपयोग होते हैं। लेकिन उनका तरीका मौलिक रूप से अलग है।
\n\nसमानता ऑपरेटर (==) — 'टाइप कन्वर्ज़न की अनुमति है'
\nडबल इक्वल (या ढीली तुलना) पहले दोनों ऑपरेंड को एक ही प्रकार में बदलता है, फिर उनके मानों की तुलना करता है। अगर प्रकार अलग हैं, तो PHP स्वचालित रूप से उन्हें एक समान आधार पर लाता है। यह सुविधाजनक है, लेकिन खतरनाक भी।
\n\nपहचान ऑपरेटर (===) — 'सब कुछ मेल खाना चाहिए'
\nट्रिपल इक्वल (या सख्त तुलना) मान और डेटा प्रकार दोनों की तुलना करता है। अगर प्रकार अलग हैं — तुरंत false, बिना किसी रूपांतरण के।
\n\nयाद रखने के लिए एक सरल तालिका:
\n- \n
$a == $b— क्या प्रकार बदलने के बाद मान बराबर हैं? \n $a === $b— क्या मान बराबर हैं और प्रकार भी समान हैं? \n
2. सरल उदाहरण: संख्याएँ और स्ट्रिंग्स
\n\nआइए एक क्लासिक मामला देखें — एक संख्या और एक स्ट्रिंग की तुलना।
\n\n<?php\n$a = 5; // integer\n$b = "5"; // string\n\n// ढीली तुलना (==)\nvar_dump($a == $b); // bool(true) — PHP स्ट्रिंग "5" को संख्या 5 में बदल देता है\n\n// सख्त तुलना (===)\nvar_dump($a === $b); // bool(false) — प्रकार अलग हैं: integer बनाम string\n?>\n\nपहले मामले में, PHP सोचता है: 'अच्छा, एक संख्या और एक स्ट्रिंग। स्ट्रिंग "5" को आसानी से संख्या 5 में बदला जा सकता है, इसलिए ये बराबर हैं।' दूसरे मामले में: 'नहीं, integer, string नहीं है, तुरंत false'।
\n\nयह एक छोटी सी बात लगती है, लेकिन यहीं से समस्याएँ शुरू होती हैं।
\n\n3. मुख्य जाल: 'खालीपन' और 'शून्य'
\n\nशुरुआती लोगों की सबसे आम गलती गलत मानों (falsy values) में उलझना है। PHP में कई ऐसे मान हैं जो ढीली तुलना में एक-दूसरे के बराबर माने जाते हैं, जबकि अर्थ में वे बिल्कुल अलग होते हैं।
\n\nयह कोड देखें:
\n\n<?php\nvar_dump(0 == false); // bool(true) — शून्य, false के बराबर है\nvar_dump(0 == null); // bool(true) — शून्य, null के बराबर है\nvar_dump(false == null); // bool(true) — false, null के बराबर है\nvar_dump("" == false); // bool(true) — खाली स्ट्रिंग, false के बराबर है\nvar_dump("" == 0); // bool(true) — खाली स्ट्रिंग, शून्य के बराबर है\n?>\n\nहैरानी हुई? बिल्कुल! 0 == false true है, "" == 0 भी true है। अगर आप जाँच रहे हैं कि उपयोगकर्ता ने पासवर्ड डाला है या नहीं और लिखते हैं if ($password == ""), फिर तुलना करते हैं if ($password == 0) से — दोनों शर्तें एक जैसी काम कर सकती हैं, जबकि ये अलग-अलग परिदृश्य हैं।
अब ट्रिपल इक्वल से तुलना करें:
\n\n<?php\nvar_dump(0 === false); // bool(false)\nvar_dump(0 === null); // bool(false)\nvar_dump("" === false); // bool(false)\nvar_dump("" === 0); // bool(false)\n?>