PHP में self या $this: कब क्या उपयोग करें? उदाहरणों के साथ विश्लेषण

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

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

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

परिचय: यह सवाल हर दूसरे PHP डेवलपर को क्यों परेशान करता है?

\n\n

यदि आपने कभी ऑब्जेक्ट-ओरिएंटेड शैली में PHP में कोड लिखा है, तो आप निश्चित रूप से इस दुविधा का सामना कर चुके हैं: कब self का उपयोग करें और कब $this का? यह प्रश्न Stack Overflow पर सबसे लोकप्रिय में से एक है (हजारों व्यूज और दर्जनों वोट)। ऐसा लगता है कि अंतर स्पष्ट है, लेकिन जैसे ही आप गहराई में जाते हैं, अनुभवी डेवलपर भी भ्रमित होने लगते हैं।

\n\n

इस लेख में हम सब कुछ स्पष्ट रूप से समझाएंगे। आप जानेंगे:

\n
    \n
  • self और $this मौलिक रूप से कैसे भिन्न हैं;
  • \n
  • किन परिस्थितियों में प्रत्येक का उपयोग अनिवार्य है;
  • \n
  • इनहेरिटेंस और स्टैटिक कॉन्टेक्स्ट कैसे काम करते हैं;
  • \n
  • और निश्चित रूप से, कोड के वास्तविक उदाहरण देखेंगे जिन्हें आप तुरंत लागू कर सकते हैं।
  • \n
\n\n

चलिए इसे हमेशा के लिए समझ लेते हैं!

\n\n

मूल नियम: स्टैटिक बनाम इंस्टेंस

\n\n

सबसे महत्वपूर्ण बात जो याद रखनी चाहिए:

\n
    \n
  • $this — वर्तमान ऑब्जेक्ट (क्लास का इंस्टेंस) को संदर्भित करता है। केवल गैर-स्टैटिक कॉन्टेक्स्ट में काम करता है।
  • \n
  • self — वर्तमान क्लास को संदर्भित करता है जिसमें कोड लिखा गया है। स्टैटिक प्रॉपर्टी, कॉन्स्टेंट और स्टैटिक मेथड तक पहुँचने के लिए उपयोग किया जाता है।
  • \n
\n\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 सभी के लिए सामान्य है।

\n\n

इनहेरिटेंस की चाल: self बनाम static

\n\n

यहाँ सबसे दिलचस्प हिस्सा शुरू होता है। कई लोग सोचते हैं कि self पॉलीमॉर्फिक व्यवहार करता है, लेकिन ऐसा नहीं है। self हमेशा उस क्लास को इंगित करता है जहाँ इसे लिखा गया है, भले ही आप चाइल्ड क्लास से मेथड को कॉल करें।

\n\n

यदि आप चाहते हैं कि कोड उस क्लास को ध्यान में रखे जहाँ से इसे कॉल किया गया है (लेट स्टैटिक बाइंडिंग), तो static का उपयोग करें।

\n\n

उदाहरण 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 का उपयोग करें।

\n\n

self के बिना कब काम नहीं चलेगा?

\n\n

ऐसी स्थितियाँ हैं जहाँ $this काम नहीं करता है, और self ही एकमात्र विकल्प है:

\n\n
    \n
  • स्टैटिक मेथड: public static function के रूप में घोषित मेथड के अंदर, कोई ऑब्जेक्ट नहीं होता है, इसलिए $this उपलब्ध नहीं है। केवल self।
  • \n
  • क्लास कॉन्स्टेंट: इन्हें self::CONSTANT (या ClassName::CONSTANT) के माध्यम से एक्सेस किया जाता है।
  • \n
  • स्टैटिक प्रॉपर्टी: self::$property।
  • \n
  • कंस्ट्रक्टर या डिस्ट्रक्टर के अंदर: हालाँकि वहाँ $this उपलब्ध है, स्टैटिक ऑपरेशन के लिए self का उपयोग करना बेहतर है।

ब्लॉग

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