PHP में डिपेंडेंसी इंजेक्शन: शुरुआती लोगों के लिए सरल गाइड

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

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

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

PHP में डिपेंडेंसी इंजेक्शन: शुरुआती लोगों के लिए

\n\n

कल्पना करें कि आप एक कंप्यूटर असेंबल कर रहे हैं। आप प्रोसेसर को मदरबोर्ड में हमेशा के लिए सोल्डर नहीं करते हैं — आप इसे एक विशेष स्लॉट में डालते हैं, ताकि ज़रूरत पड़ने पर इसे अधिक शक्तिशाली से बदल सकें। PHP में डिपेंडेंसी इंजेक्शन (DI) उसी सिद्धांत पर काम करता है: क्लास के अंदर निर्भरताएँ बनाने के बजाय, आप उन्हें बाहर से "इंजेक्ट" करते हैं।

\n\n

इस लेख में, हम समझेंगे कि डिपेंडेंसी इंजेक्शन क्या है, इसकी आवश्यकता क्यों है, और इसे PHP में कैसे लागू करें। आप सीखेंगे कि अपने कोड को लचीला, परीक्षण योग्य और रखरखाव में आसान कैसे बनाएं।

\n\n

सरल शब्दों में डिपेंडेंसी इंजेक्शन क्या है

\n\n

डिपेंडेंसी इंजेक्शन एक डिज़ाइन पैटर्न है, जिसमें कोई ऑब्जेक्ट अपनी निर्भरताएँ (अन्य ऑब्जेक्ट, सेवाएँ) बाहर से प्राप्त करता है, न कि उन्हें स्वयं बनाता है। क्लास के अंदर new Database() लिखने के बजाय, आप कंस्ट्रक्टर या सेटर के माध्यम से एक तैयार डेटाबेस ऑब्जेक्ट पास करते हैं।

\n\n

आइए उस समस्या को देखें जिसे DI हल करता है। UserService क्लास पर विचार करें, जो सीधे डेटाबेस कनेक्शन बनाता है:

\n\n
<?php\nclass UserService {\n    private $db;\n    \n    public function __construct() {\n        // विशिष्ट कार्यान्वयन के साथ कठोर संबंध\n        $this->db = new MySQLConnection('localhost', 'user', 'pass');\n    }\n    \n    public function getUser($id) {\n        return $this->db->query("SELECT * FROM users WHERE id = $id");\n    }\n}\n?>
\n\n

इस दृष्टिकोण की समस्याएँ स्पष्ट हैं:

\n\n
    \n
  • कठोर संबंध (tight coupling) — UserService क्लास MySQLConnection से बंधी हुई है। PostgreSQL पर स्विच करने के लिए, क्लास का कोड बदलना होगा।
  • \n
  • परीक्षण में कठिनाई — आप यूनिट टेस्ट में डेटाबेस को mock-ऑब्जेक्ट से प्रतिस्थापित नहीं कर सकते।
  • \n
  • एकल जिम्मेदारी सिद्धांत का उल्लंघन — क्लास न केवल उपयोगकर्ताओं के साथ काम करता है, बल्कि DB कनेक्शन भी बनाता है।
  • \n
\n\n

अब इस क्लास को डिपेंडेंसी इंजेक्शन का उपयोग करके फिर से लिखते हैं:

\n\n
<?php\ninterface DatabaseInterface {\n    public function query($sql);\n}\n\nclass MySQLConnection implements DatabaseInterface {\n    public function query($sql) {\n        // MySQL के लिए कार्यान्वयन\n    }\n}\n\nclass PostgreSQLConnection implements DatabaseInterface {\n    public function query($sql) {\n        // PostgreSQL के लिए कार्यान्वयन\n    }\n}\n\nclass UserService {\n    private $db;\n    \n    // कंस्ट्रक्टर के माध्यम से निर्भरता इंजेक्ट की जाती है\n    public function __construct(DatabaseInterface $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$db = new MySQLConnection('localhost', 'user', 'pass');\n$userService = new UserService($db);\n?>
\n\n

अब UserService को यह नहीं पता कि वह किस डेटाबेस के साथ काम कर रहा है। वह बस DatabaseInterface इंटरफ़ेस का उपयोग करता है। यही डिपेंडेंसी इंजेक्शन का सार है।

\n\n

निर्भरता इंजेक्शन के तीन मुख्य प्रकार

\n\n

PHP में निर्भरता इंजेक्ट करने के तीन मुख्य तरीके हैं। आइए प्रत्येक पर विचार करें।

\n\n

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

\n\n

यह सबसे सामान्य और अनुशंसित तरीका है। निर्भरताएँ कंस्ट्रक्टर के पैरामीटर के माध्यम से पास की जाती हैं और क्लास के प्राइवेट गुणों में संग्रहीत की जाती हैं।

\n\n
<?php\nclass Logger {\n    private $writer;\n    \n    public function __construct(LogWriterInterface $writer) {\n        $this->writer = $writer;\n    }\n    \n    public function log($message) {\n        $this->writer->write($message);\n    }\n}\n?>
\n\n

लाभ: निर्भरताएँ स्पष्ट रूप से दिखाई देती हैं, ऑब्जेक्ट हमेशा मान्य स्थिति में होता है (सभी निर्भरताएँ अनिवार्य हैं)।

\n\n

नुकसान: य

ब्लॉग

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