2008-10-12 14 views
7

के साथ संभावित परिपत्र निर्भरता समस्या मुझे लगता है कि मुझे लगता है कि मेरे PHP अनुप्रयोग के साथ एक परिपत्र निर्भरता समस्या है। अगर यह गलत है तो कृपया मुझे बताएं।PHP अनुप्रयोग

दो कक्षाएं, LogManager और DBSession: यहाँ स्थिति है।

DBSession डेटाबेस के साथ बातचीत करने के लिए इस्तेमाल किया जाता है, और LogManager फ़ाइलों के लिए लॉग इन करने के लिए किया जाता है। दोनों मेरे आवेदन में व्यापक रूप से उपयोग किया जाता है। जब आप डीबीएसशन का उदाहरण बनाते हैं, तो आपको इसे एक निर्माता पैरामीटर के माध्यम से LogManager का एक उदाहरण देना होगा। ऐसा इसलिए क्योंकि DBSession कभी-कभी फ़ाइल में जानकारी लॉग करेगा, और ऐसा करने के लिए LogManager इंस्टेंस का उपयोग करेगा।

अब, मैं LogManager विस्तार करने के लिए इतना है कि यह भी नहीं बल्कि एक पाठ फ़ाइल से, एक डेटाबेस तालिका करने के लिए लॉग इन कर चाहता था। स्वाभाविक रूप से, मेरी प्राथमिकता मौजूदा वर्गों का पुन: उपयोग करना है, लेकिन मुझे जल्द ही एहसास हुआ कि यह एक दिलचस्प स्थिति लाया है।

डीबीएसशन को पहले से ही निर्माण के लिए लॉगमैनेजर का एक उदाहरण चाहिए। अगर मैं LogManager में डीबीएसशन कक्षा का पुनः उपयोग करना चाहता हूं, तो अब उसे डीबीएसशन के उदाहरण की आवश्यकता होगी। मैं दोनों मांगों को कैसे पूरा कर सकता हूं? जाहिर है, मेरे दृष्टिकोण के साथ कुछ गलत होना चाहिए।

आप कैसे सुझाव देंगे कि मैं इसे ठीक करूँ?

अग्रिम धन्यवाद, दोस्तों।

उत्तर

8

LogManager का विस्तार न करें, इसे एक समग्र प्रकार दें। और जहां प्रवेश करना चाहते हैं के चुनाव, यानी .:

$logManager = new LogManager(); 
$dbSession = new DbSession($logManager); 
$logManager->add(new FileLog($filename)); 
$logManager->add(new DBLog($dbSession)); 

कहाँ निश्चित रूप से FileLog और DBLog एक आम इंटरफेस का हिस्सा देरी। यह ऑब्जर्वर पैटर्न का एक अनुप्रयोग है, जहां ऐड() "सब्सक्राइब" ऑपरेशन है, और फाइललॉग/डीबीएलॉग लॉगिंग घटनाओं के पर्यवेक्षक हैं। (इस तरह आप भी लॉग कई स्थानों में बचा सकता है।)

ओवेन संपादित: php वाक्य रचना करने के लिए समायोजित।

+0

$ logManager = new LogManager(); $ dbSession = नया डीबीएसशन ($ logManager); $ logManager-> जोड़ें (नया फ़ाइल लॉग ($ फ़ाइल नाम)); $ logManager-> जोड़ें (नया डीबीएलओजी ($ डीबीएसशन)); – micahwittman

+0

यह कक्षा के नामों में संगत नहीं है .. –

+0

@ ओवेन: संपादन के लिए धन्यवाद! –

1

हो सकता है कि आप कुछ पैटर्न, Singleton Pattern तरह सुनिश्चित करें कि आप केवल उदाहरण के लिए अपने LogManager वर्ग का एक उदाहरण है आवेदन कर सकते हैं।

2

इन वस्तुओं में से एक वास्तव में अन्य की जरूरत नहीं है: आपने सही अनुमान लगाया, यह DBSession है। उस ऑब्जेक्ट को संशोधित करें ताकि निर्माण के बाद लॉगर को उससे जोड़ा जा सके।

2

क्यों एक DbSession वस्तु के निर्माण के लिए एक LogManager वस्तु की मांग करते हैं, तो यह केवल कभी कभी फ़ाइलों के लिए लिखता है? आलसी लोड केवल इसके बजाय जब आपको इसकी आवश्यकता होती है। इसके अलावा, मेरी राय में दोनों एक दूसरे से स्वतंत्र होना चाहिए। जब आवश्यक हो तो प्रत्येक दूसरे को उदाहरण दे सकता है।

+0

कभी आलसी लोडिंग को लागू करने की कोशिश नहीं की, लेकिन सिफारिश के लिए धन्यवाद। मैं मानता हूं कि यह अधिक उपयुक्त होगा क्योंकि लॉगमैनेजर को कभी-कभी डीबीएसशन के साथ उपयोग किया जाता है। धन्यवाद! –

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