PHP में New self बनाम new static: 2025 में क्या चुनें?
\n\nकल्पना करें: आप कई वर्षों से PHP में कोड लिख रहे हैं, आत्मविश्वास महसूस करते हैं, और अचानक आपका सहकर्मी (या Stack Overflow) एक प्रश्न पूछता है: "जब मैं new self() के माध्यम से कंस्ट्रक्टर को कॉल करता हूँ तो मेरी चाइल्ड क्लास में पैरेंट क्लास का ऑब्जेक्ट क्यों बनता है?" परिचित लगता है? यदि हाँ, तो आप अकेले नहीं हैं। विषय new self बनाम new static Stack Overflow पर हजारों व्यूज़ वाले सबसे लोकप्रिय प्रश्नों में से एक है। और 2025 में, PHP के नए संस्करणों के आने के साथ, इस अंतर को समझना और भी महत्वपूर्ण हो गया है।
इस लेख में, हम समझेंगे कि ऑब्जेक्ट बनाते समय self और static में क्या अंतर है, लेट स्टैटिक बाइंडिंग (Late Static Binding) कैसे काम करता है, और सबसे महत्वपूर्ण बात, कब किसका उपयोग करना है। चलिए शुरू करते हैं!
समस्या: self हमेशा पैरेंट की ओर इशारा करता है
\n\nआइए एक क्लासिक उदाहरण से शुरू करते हैं। मान लीजिए हमारे पास एक पैरेंट क्लास BaseController और एक चाइल्ड क्लास ApiController है।
<?php\n\nclass BaseController {\n public static function create() {\n return new self(); // ध्यान दें! self का अर्थ है BaseController\n }\n}\n\nclass ApiController extends BaseController {\n // create() को इनहेरिट करता है\n}\n\n$api = ApiController::create();\nvar_dump($api); // object(BaseController)#1 (0) { }\n?>\n\nहमें ApiController का ऑब्जेक्ट मिलने की उम्मीद थी, लेकिन हमें BaseController मिला। क्यों? क्योंकि पैरेंट क्लास के संदर्भ में self हमेशा उस क्लास को संदर्भित करता है जहाँ इसे लिखा गया है, न कि उस क्लास को जिसके माध्यम से इसे कॉल किया गया है। यह अर्ली स्टैटिक बाइंडिंग है। PHP कंपाइल समय पर क्लास को "याद" रखता है, न कि रनटाइम पर।
समाधान: static का उपयोग करें
\n\nस्थिति को ठीक करने के लिए, self को static से बदलें। यह लेट स्टैटिक बाइंडिंग (LSP) तंत्र को सक्रिय करता है।
<?php\n\nclass BaseController {\n public static function create() {\n return new static(); // static का अर्थ है वह क्लास जिसने मेथड को कॉल किया\n }\n}\n\nclass ApiController extends BaseController {\n // create() को इनहेरिट करता है\n}\n\n$api = ApiController::create();\nvar_dump($api); // object(ApiController)#1 (0) { }\n?>\n\nअब $api एक ApiController ऑब्जेक्ट है। static रनटाइम पर हल होता है और उस क्लास को इंगित करता है जिसके माध्यम से मेथड को कॉल किया गया था। यही लेट स्टैटिक बाइंडिंग है।
self का उपयोग कब करें और static का कब?
\n\n2025 में, सर्वोत्तम प्रथाएँ इन दोनों दृष्टिकोणों को स्पष्ट रूप से अलग करती हैं। यहाँ मुख्य नियम दिए गए हैं।
\n\nself का उपयोग करें जब:
\n- \n
- आप एक ही क्लास के अंदर काम कर रहे हैं और दिए गए मेथड के लिए इनहेरिटेंस की उम्मीद नहीं करते हैं। \n
- आपको ठीक उसी क्लास का ऑब्जेक्ट बनाने की आवश्यकता है जिसमें कोड लिखा गया है, न कि चाइल्ड क्लास का। \n
- आप कॉन्स्टेंट या स्टैटिक प्रॉपर्टीज़ तक पहुँच रहे हैं जिन्हें ओवरराइड नहीं किया जाना चाहिए। \n
उदाहरण: एक फैक्ट्री मेथड जो गारंटी के साथ बेस क्लास का ऑब्जेक्ट लौटाता है।
\n\n<?php\n\nclass Logger {\n protected static $instance;\n\n public static function getInstance() {\n if (self::$instance === null) {\n self::$instance = new self(); // हमेशा Logger\n }\n return self::$instance;\n }\n}\n?>\n\nstatic का उपयोग करें जब:
\n- \n
- आप विस्तार के लिए कोड डिज़ाइन कर रहे हैं — उदाहरण के लिए, एब्सट्रैक्ट क्लास या ट्रेट्स। \n
- आपको चाहिए कि चाइल्ड क्लास अपने स्वयं के इंस्टेंस बना सकें। \n
- आप Factory Method या Builder पैटर्न का उपयोग कर रहे हैं। \n
उदाहरण: एंटिटीज़ के लिए एक एब्सट्रैक्ट क्लास।
\n\n<?php\n\nabstract class Entity {\n public static function create(array $data): static {\