PHP में Dependency Injection (डिपेंडेंसी इंजेक्शन) शुरुआती गाइड

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

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

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

PHP में Dependency Injection क्या है और इसकी ज़रूरत क्यों है?

\n\n

मान लीजिए आप एक घर बना रहे हैं। हर ईंट खुद बनाने के बजाय, आप उन्हें ऑर्डर करते हैं और तैयार ईंटों का उपयोग करते हैं। Dependency Injection (DI) प्रोग्रामिंग में इसी सिद्धांत पर काम करता है — आप क्लास के अंदर ऑब्जेक्ट नहीं बनाते, बल्कि उन्हें बाहर से प्राप्त करते हैं। इससे आपका कोड लचीला, टेस्ट करने योग्य और समझने में आसान बनता है।

\n\n

PHP में, किसी भी ऑब्जेक्ट-ओरिएंटेड भाषा की तरह, क्लास अक्सर दूसरी क्लास पर निर्भर होते हैं। समस्या तब आती है जब डिपेंडेंसी क्लास के अंदर ही बनाई जाती है — इसे टाइट कपलिंग (tight coupling) कहते हैं। Dependency Injection इस समस्या को बाहर से डिपेंडेंसी पास करके हल करता है।

\n\n

Dependency Injection के बिना समस्या

\n

एक सामान्य उदाहरण देखें, जहाँ UserService क्लास खुद डेटाबेस ऑब्जेक्ट बनाता है:

\n\n
<?php\nclass Database {\n    public function query($sql) {\n        // क्वेरी लॉजिक\n        return "परिणाम: " . $sql;\n    }\n}\n\nclass UserService {\n    private $db;\n    \n    public function __construct() {\n        // टाइट कपलिंग — क्लास खुद डिपेंडेंसी बना रहा है\n        $this->db = new Database();\n    }\n    \n    public function getUser($id) {\n        return $this->db->query("SELECT * FROM users WHERE id = $id");\n    }\n}\n\n$service = new UserService();\necho $service->getUser(1);\n?>
\n\n

इस तरीके की समस्याएँ:

\n
    \n
  • Database को किसी दूसरे इम्प्लीमेंटेशन से बदलना मुश्किल (जैसे टेस्टिंग के लिए)
  • \n
  • टेस्ट करना कठिन — मॉक (mock) नहीं लगा सकते
  • \n
  • कोड मोनोलिथिक और विस्तार में मुश्किल हो जाता है
  • \n
\n\n

समाधान: कंस्ट्रक्टर के ज़रिए डिपेंडेंसी इंजेक्शन

\n

अब उसी क्लास को Dependency Injection का उपयोग करके फिर से लिखते हैं:

\n\n
<?php\nclass UserService {\n    private $db;\n    \n    // डिपेंडेंसी बाहर से पास की जा रही है\n    public function __construct(Database $db) {\n        $this->db = $db;\n    }\n    \n    public function getUser($id) {\n        return $this->db->query("SELECT * FROM users WHERE id = $id");\n    }\n}\n\n// डिपेंडेंसी अलग से बनाएँ\n$database = new Database();\n$service = new UserService($database);\necho $service->getUser(1);\n?>
\n\n

अब UserService को यह नहीं पता कि Database कैसे बनता है। वह बस उसका उपयोग करता है जो उसे दिया गया। इसे ही डिपेंडेंसी इंजेक्शन कहते हैं।

\n\n

PHP में Dependency Injection के प्रकार

\n

डिपेंडेंसी इंजेक्ट करने के तीन मुख्य तरीके हैं। आइए उदाहरणों के साथ समझते हैं।

\n\n

1. कंस्ट्रक्टर इंजेक्शन (Constructor Injection)

\n

सबसे आम और अनुशंसित तरीका। ऑब्जेक्ट बनाते समय कंस्ट्रक्टर के ज़रिए डिपेंडेंसी पास की जाती है।

\n\n
<?php\nclass Logger {\n    public function log($message) {\n        echo "[लॉग]: " . $message;\n    }\n}\n\nclass OrderProcessor {\n    private $logger;\n    \n    // कंस्ट्रक्टर में डिपेंडेंसी\n    public function __construct(Logger $logger) {\n        $this->logger = $logger;\n    }\n    \n    public function process($order) {\n        // ऑर्डर प्रोसेसिंग\n        $this->logger->log("ऑर्डर प्रोसेस हुआ: " . $order);\n    }\n}\n\n$logger = new Logger();\n$processor = new OrderProcessor($logger);\n$processor->process("ऑर्डर #123");\n?>
\n\n

फायदे: डिपेंडेंसी हमेशा उपलब्ध, ऑब्जेक्ट हमेशा वैलिड स्थिति में। नुकसान: अगर बहुत सारी डिपेंडेंसी हों, तो कंस्ट्रक्टर बड़ा हो सकता है।

\n\n

2. सेटर इंजेक्शन (Setter Injection)

\n

जब डिपेंडेंसी वैकल्पिक हो या ऑब्जेक्ट के जीवनकाल में बदलनी हो, तब इसका उपयोग करें।

\n\n
<?php\nclass MailService {\n    private $transport;\n    \n    // डिपेंडेंसी के लिए सेटर\n    public function setTransport($transport) {\n        $this->transport = $transport;\n    }\n    \n    public function send($to, $mess                

ब्लॉग

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