2015-09-29 6 views
7

मैं PHP में निर्भरता इंजेक्शन को समझने की कोशिश कर रहा हूं और मुझे लगता है कि लार्वेल में ऐसा करने के दो तरीके हैं।php में इन दो प्रकार के कन्स्ट्रक्टर इंजेक्शन के बीच क्या अंतर है?

class Foo{ 

} 

अब मैं एक वर्ग Bar कहा जाता है जो Foo पर निर्भर है इसलिए मैं कुछ ऐसा कर सकता है::

class Bar{ 
    protected $foo; 
    public function __construct() 
    { 
     $this->foo = new Foo(); 
    } 
} 

लेकिन

तो हम कहते हैं कि मैं एक वर्ग Foo तो जैसे डालते हैं लार्वेल में, मैं टाइपहिंटिंग और प्रतिबिंब जैसे शब्दों में आया हूं जो मुझे यह करने की अनुमति देता है:

class Bar{ 
    protected $foo; 
    public function __construct(Foo $foo) 
    { 
     $this->foo = $foo; 
    } 
} 

जो मैं समझने की कोशिश कर रहा हूं वह इन दोनों के बीच का अंतर है। क्या वे पूरी तरह से समान हैं? और क्या एक विशिष्ट कारण है कि मुझे दूसरे पर पसंद करना चाहिए?

पीएस: मैं नौसिखिया हूं और मुझे यकीन नहीं है कि क्या मैं सही तरीके से शब्द में शब्दजाल का उपयोग कर रहा हूं।

+9

पहला उदाहरण परीक्षण करना बहुत मुश्किल है, क्योंकि आप बार के अंदर फू का नकल नहीं कर सकते हैं; दूसरे को निर्भरता इंजेक्शन (डीआई) कहा जाता है, और जब आप बार –

+3

का परीक्षण कर रहे हैं [निर्भरता इंजेक्शन क्या है?] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/130794/what-is- निर्भरता-इंजेक्शन) – Gal

+5

दूसरा फू वास्तव में एक फू उदाहरण होने की आवश्यकता को भी समाप्त करता है, लेकिन यह या तो फू या किसी भी वर्ग का उदाहरण देता है जो फू (प्रकार संकेत संकेत देता है) .... ढीला युग्मन , क्योंकि अब आप एक वास्तविक Foo –

उत्तर

1

यह अधिकतर कोड कोड के साथ आता है।

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); 

ऊपर कोड जहां यह निर्णय लिया जा रहा है जोBarFoo में इंजेक्ट किया जाता है। यह वह जगह भी है जहां Bar की निर्भरताओं के बारे में चिंता करने की आवश्यकता है। ध्यान दें कि निर्भरता लोडिंग और तत्कालता ही यह कोड एकमात्र चीज है। Foo या Bar को छूने की आवश्यकता के बिना आवश्यक कोड के केवल इस टुकड़े को बदलने के लिए तुच्छ है, जो कि जटिल व्यावसायिक तर्क से भरा हो सकता है।

निर्भरता इंजेक्शन कोड आपको अपने ऐप को अलग करने और इसे लचीले ढंग से एक साथ रखने की अनुमति देता है। उदाहरण के लिए परीक्षण उद्देश्यों के लिए। या विभिन्न संदर्भों में आसानी से विभिन्न घटकों का पुन: उपयोग करने के लिए।

How Not To Kill Your Testability Using Statics भी देखें।

+0

इस विस्तृत उत्तर के लिए आपको बहुत बहुत धन्यवाद। मैं इसकी सराहना करता हूं। :) – Rohan

संबंधित मुद्दे