यह अधिकतर कोड कोड के साथ आता है।
class Foo {
public function __construct() {
new Bar;
}
}
यह जोड़ों के एक बहुत ही विशेष Bar
इस विशिष्ट Foo
करने के लिए। को बदलने का कोई तरीका नहीं है जोBar
इस कोड को फिर से लिखने के बिना तत्काल हो जाता है। इसका मतलब है कि Foo
को Bar
की निर्भरताओं के बारे में जानना आवश्यक है। शायद आज Bar
को new Bar
के साथ तुरंत चालू किया जा सकता है। लेकिन शायद कल आप Bar
को दोबारा कर रहे हैं और अब इसे new Bar($database)
के साथ तुरंत चालू करना होगा। अब आपको समायोजित करने के लिए Foo
को फिर से लिखना होगा।
class Foo {
public function __construct(Bar $bar) { }
}
यह Foo
केवल घोषणा करता है कि यह की विशेषताओं के साथ एक वस्तु की जरूरत है:
वहीं निर्भरता इंजेक्शन भूमिका शुरू होती है (ऊपर नहीं निर्भरता इंजेक्शन है, तो आप नहीं इंजेक्शन लगाने कुछ भी कर रहे हैं) तात्कालिकता पर Bar
। लेकिन Foo
को Bar
होने के बारे में कुछ भी जानने की आवश्यकता नहीं है, इसकी निर्भरता क्या है या यह वास्तव में क्या करता है। Bar
की अपेक्षा की जाने वाली एकमात्र चीज एक परिभाषित public
इंटरफ़ेस है, इसके बारे में और कुछ भी अप्रासंगिक है। वास्तव में, यहां तक कि अधिक लचीलापन हासिल करने के लिए, आप कंक्रीट क्लास निर्भरता के बजाय interface
का उपयोग करना चाह सकते हैं।
निर्भरता इंजेक्शन आपको अन्य कोड से कक्षाओं के ठोस विवरण तलाक की अनुमति देता है। यह आपको एक केंद्रीय स्थान प्राप्त करने की अनुमति देता है जहां कक्षाएं तत्काल होती हैं, जो एक ऐसी जगह है जहां आपको तत्काल कक्षाओं के बारे में ठोस जानकारी जानने और विचार करने की आवश्यकता होती है। उदाहरण के लिए यह एक निर्भरता इंजेक्शन कंटेनर हो सकता है। आप पूरे स्थान पर क्लास इंस्टेंटेशन लॉजिक फैलाना नहीं चाहते हैं, क्योंकि ऊपर वर्णित अनुसार, वह तर्क बदल सकता है, और फिर आपको जगह पर कोड फिर से लिखना होगा।
require_once 'Foo.php';
require_once 'Bar.php';
$foo = new Foo(new Bar);
ऊपर कोड जहां यह निर्णय लिया जा रहा है जोBar
Foo
में इंजेक्ट किया जाता है। यह वह जगह भी है जहां Bar
की निर्भरताओं के बारे में चिंता करने की आवश्यकता है। ध्यान दें कि निर्भरता लोडिंग और तत्कालता ही यह कोड एकमात्र चीज है। Foo
या Bar
को छूने की आवश्यकता के बिना आवश्यक कोड के केवल इस टुकड़े को बदलने के लिए तुच्छ है, जो कि जटिल व्यावसायिक तर्क से भरा हो सकता है।
निर्भरता इंजेक्शन कोड आपको अपने ऐप को अलग करने और इसे लचीले ढंग से एक साथ रखने की अनुमति देता है। उदाहरण के लिए परीक्षण उद्देश्यों के लिए। या विभिन्न संदर्भों में आसानी से विभिन्न घटकों का पुन: उपयोग करने के लिए।
How Not To Kill Your Testability Using Statics भी देखें।
पहला उदाहरण परीक्षण करना बहुत मुश्किल है, क्योंकि आप बार के अंदर फू का नकल नहीं कर सकते हैं; दूसरे को निर्भरता इंजेक्शन (डीआई) कहा जाता है, और जब आप बार –
का परीक्षण कर रहे हैं [निर्भरता इंजेक्शन क्या है?] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/130794/what-is- निर्भरता-इंजेक्शन) – Gal
दूसरा फू वास्तव में एक फू उदाहरण होने की आवश्यकता को भी समाप्त करता है, लेकिन यह या तो फू या किसी भी वर्ग का उदाहरण देता है जो फू (प्रकार संकेत संकेत देता है) .... ढीला युग्मन , क्योंकि अब आप एक वास्तविक Foo –