कब उपयोग करें self और कब $this? इसे हमेशा के लिए समझें
\n\nअगर आपने कभी PHP में ऑब्जेक्ट-ओरिएंटेड स्टाइल में कोड लिखा है, तो आपने शायद यह सवाल पूछा होगा: "आखिर self या $this में से क्या चुनूं?" यह सवाल इतना लोकप्रिय है कि Stack Overflow पर इसके हज़ारों व्यूज़ और सैकड़ों कमेंट्स हैं। और यह कोई संयोग नहीं है: इन दोनों के बीच का अंतर उन छोटी-छोटी चीज़ों में से एक है जो आपके कोड को या तो काम करने वाला लेकिन भ्रमित करने वाला बना सकता है, या फिर सुरुचिपूर्ण और समझने में आसान।
चलिए एक बात साफ कर लें: ये एक-दूसरे के विकल्प नहीं हैं. इनका दर्शन अलग है और, इससे भी महत्वपूर्ण बात, इनका व्यवहार इनहेरिटेंस (विरासत) में अलग होता है। अगर आप $this का उपयोग वहाँ करते हैं जहाँ self का उपयोग होना चाहिए, या इसके विपरीत, तो आपको लॉजिकल एरर मिल सकते हैं जिन्हें पकड़ना मुश्किल होता है।
इस लेख में हम हर चीज़ को स्पष्ट रूप से समझाएंगे: बुनियादी बातों से लेकर उन्नत परिदृश्यों तक। चलिए शुरू करते हैं!
\n\n\n\n
संक्षिप्त उत्तर (उन लोगों के लिए जो जल्दी में हैं)
\n\nअगर आप केवल एक नियम याद रखना चाहते हैं, तो यह याद रखें:
\n\n- \n
$this->— इंस्टेंस (ऑब्जेक्ट) के प्रॉपर्टी और मेथड तक पहुँचने के लिए। केवल नॉन-स्टैटिक कॉन्टेक्स्ट में काम करता है। \n self::— क्लास के स्टैटिक प्रॉपर्टी और मेथड तक पहुँचने के लिए। स्टैटिक और नॉन-स्टैटिक दोनों कॉन्टेक्स्ट में काम करता है। \n static::— "लेट स्टैटिक बाइंडिंग" (Late Static Binding)। इसका उपयोग तब किया जाता है जब चाइल्ड क्लास को पैरेंट के व्यवहार को ओवरराइड करने की आवश्यकता होती है। \n
लेकिन हमेशा की तरह, असली चीज़ विवरण में छिपी है। आइए गहराई में जाएं।
\n\n$this क्या है?
\n\n$this एक स्यूडो-वेरिएबल है जो वर्तमान ऑब्जेक्ट को संदर्भित करता है। यह केवल क्लास के मेथड (नॉन-स्टैटिक) के अंदर उपलब्ध होता है और उसी इंस्टेंस की ओर इशारा करता है जिसके साथ आप काम कर रहे हैं।
<?php\n\nclass User {\n public string $name;\n\n public function setName(string $name): void {\n $this->name = $name; // वर्तमान ऑब्जेक्ट की प्रॉपर्टी तक पहुँच\n }\n\n public function getName(): string {\n return $this->name;\n }\n}\n\n$user = new User();\n$user->setName('अन्ना');\necho $user->getName(); // अन्ना\n\nयह बहुत सरल है: $this->name का मतलब है "उस ऑब्जेक्ट की name प्रॉपर्टी लो जिसने इस मेथड को कॉल किया है"।
self क्या है?
\n\nself वर्तमान क्लास का संदर्भ है, न कि ऑब्जेक्ट का। इसका उपयोग क्लास के स्टैटिक मेंबर्स (प्रॉपर्टी और मेथड जो static कीवर्ड से घोषित किए गए हैं) तक पहुँचने के लिए किया जाता है।
<?php\n\nclass Config {\n public static string $appName = 'PythonLib';\n\n public static function getAppName(): string {\n return self::$appName; // क्लास की स्टैटिक प्रॉपर्टी तक पहुँच\n }\n}\n\necho Config::getAppName(); // PythonLib\n\nध्यान दें: self हमेशा उसी क्लास को संदर्भित करता है जिसमें इसे लिखा गया है। भले ही आप कोई चाइल्ड क्लास बनाएं, पैरेंट क्लास में self पैरेंट को ही इंगित करता रहेगा। यह static से सबसे बड़ा अंतर है।
मुख्य अंतर: इनहेरिटेंस में self बनाम $this
\n\nयहाँ से सबसे दिलचस्प बात शुरू होती है। मान लीजिए कि आपके पास एक बेस क्लास Animal और एक चाइल्ड क्लास Dog है।
<?php\n\nclass Animal {\n public static function whoAmI(): string {\n return 'मैं एक जानवर हूँ';\n }\n\n public function say(): string {\n // self का उपयोग कर रहे हैं - यह Animal क्लास से बंधा है\n return self::whoAmI();\n }\n}\n\nclass Dog extends Animal {\n public static function whoAmI(): string {\n return 'मैं एक कुत्ता हूँ';\n }\n}\n\n$dog = new Dog();\necho $dog->say(); // मैं एक जानवर हूँ