परिचय: यह सवाल हर दूसरे PHP डेवलपर को क्यों परेशान करता है?
\n\nयदि आपने कभी ऑब्जेक्ट-ओरिएंटेड शैली में PHP में कोड लिखा है, तो आप निश्चित रूप से इस दुविधा का सामना कर चुके हैं: कब self का उपयोग करें और कब $this का? यह प्रश्न Stack Overflow पर सबसे लोकप्रिय में से एक है (हजारों व्यूज और दर्जनों वोट)। ऐसा लगता है कि अंतर स्पष्ट है, लेकिन जैसे ही आप गहराई में जाते हैं, अनुभवी डेवलपर भी भ्रमित होने लगते हैं।
इस लेख में हम सब कुछ स्पष्ट रूप से समझाएंगे। आप जानेंगे:
\n- \n
selfऔर$thisमौलिक रूप से कैसे भिन्न हैं; \n - किन परिस्थितियों में प्रत्येक का उपयोग अनिवार्य है; \n
- इनहेरिटेंस और स्टैटिक कॉन्टेक्स्ट कैसे काम करते हैं; \n
- और निश्चित रूप से, कोड के वास्तविक उदाहरण देखेंगे जिन्हें आप तुरंत लागू कर सकते हैं। \n
चलिए इसे हमेशा के लिए समझ लेते हैं!
\n\nमूल नियम: स्टैटिक बनाम इंस्टेंस
\n\nसबसे महत्वपूर्ण बात जो याद रखनी चाहिए:
\n- \n
$this— वर्तमान ऑब्जेक्ट (क्लास का इंस्टेंस) को संदर्भित करता है। केवल गैर-स्टैटिक कॉन्टेक्स्ट में काम करता है। \n self— वर्तमान क्लास को संदर्भित करता है जिसमें कोड लिखा गया है। स्टैटिक प्रॉपर्टी, कॉन्स्टेंट और स्टैटिक मेथड तक पहुँचने के लिए उपयोग किया जाता है। \n
सरल लगता है? आइए एक उदाहरण से जाँच करें।
\n\nउदाहरण 1: सरल क्लास
\n<?php\nclass Coffee\n{\n public static $type = 'अरेबिका';\n public $sugar = 2;\n\n public function info()\n {\n // $this — ऑब्जेक्ट की प्रॉपर्टी के लिए\n echo "चीनी: {$this->sugar} चम्मच।";\n\n // self — स्टैटिक प्रॉपर्टी के लिए\n echo "कॉफी का प्रकार: " . self::$type;\n }\n}\n\n$cup = new Coffee();\n$cup->info(); // आउटपुट: चीनी: 2 चम्मच। कॉफी का प्रकार: अरेबिका\n?>\n\nयहाँ सब कुछ तार्किक है: $this->sugar प्रत्येक कप के लिए अद्वितीय है, और self::$type सभी के लिए सामान्य है।
इनहेरिटेंस की चाल: self बनाम static
\n\nयहाँ सबसे दिलचस्प हिस्सा शुरू होता है। कई लोग सोचते हैं कि self पॉलीमॉर्फिक व्यवहार करता है, लेकिन ऐसा नहीं है। self हमेशा उस क्लास को इंगित करता है जहाँ इसे लिखा गया है, भले ही आप चाइल्ड क्लास से मेथड को कॉल करें।
यदि आप चाहते हैं कि कोड उस क्लास को ध्यान में रखे जहाँ से इसे कॉल किया गया है (लेट स्टैटिक बाइंडिंग), तो static का उपयोग करें।
उदाहरण 2: इनहेरिटेंस और चाल
\n<?php\nclass Animal\n{\n public static $sound = '...';\n\n public static function speak()\n {\n // ध्यान दें: self का मतलब Animal है, Dog नहीं!\n echo self::$sound;\n }\n\n public static function speakCorrect()\n {\n // static का मतलब वह क्लास है जिसने मेथड को कॉल किया\n echo static::$sound;\n }\n}\n\nclass Dog extends Animal\n{\n public static $sound = 'भौं!';\n}\n\nDog::speak(); // आउटपुट: ... (क्योंकि self = Animal)\nDog::speakCorrect(); // आउटपुट: भौं! (क्योंकि static = Dog)\n?>\n\nयह उदाहरण बग का एक सामान्य कारण है। यदि आप एक लाइब्रेरी लिख रहे हैं और उम्मीद करते हैं कि चाइल्ड क्लास स्टैटिक प्रॉपर्टी को ओवरराइड कर सकेंगे, तो हमेशा self के बजाय static का उपयोग करें।
self के बिना कब काम नहीं चलेगा?
\n\nऐसी स्थितियाँ हैं जहाँ $this काम नहीं करता है, और self ही एकमात्र विकल्प है:
- \n
- स्टैटिक मेथड:
public static functionके रूप में घोषित मेथड के अंदर, कोई ऑब्जेक्ट नहीं होता है, इसलिए$thisउपलब्ध नहीं है। केवलself। \n - क्लास कॉन्स्टेंट: इन्हें
self::CONSTANT(याClassName::CONSTANT) के माध्यम से एक्सेस किया जाता है। \n - स्टैटिक प्रॉपर्टी:
self::$property। \n - कंस्ट्रक्टर या डिस्ट्रक्टर के अंदर: हालाँकि वहाँ
$thisउपलब्ध है, स्टैटिक ऑपरेशन के लिएselfका उपयोग करना बेहतर है।