2009-12-08 7 views
5

मेरे पास स्थैतिक वर्ग विधियों का एक सेट है। मेरे पास ऑब्जेक्ट वेरिएबल $ डीबी में संग्रहीत स्क्रिप्ट में मौजूदा डेटाबेस कनेक्शन भी है। मैं उन स्थैतिक वर्ग विधियों को कैसे कॉल करूं और उन्हें कक्षा विधि पर पैरामीटर के रूप में हर बार इस चर को पास किए बिना उस $ डीबी ऑब्जेक्ट का उपयोग करने दें?PHP: स्थैतिक वर्ग विधियों के लिए मौजूदा डेटाबेस कनेक्शन कैसे पास करें?

उदाहरण के लिए

, अभी मैं एक वैश्विक, दुर्भाग्य से उपयोग करने के लिए हो रही है:

class Foo { 
    public static function Bar() { 
    global $DB; 
    return $DB->DSN_STRING; 
    } 
} 

यह है कि मैं अपने स्थिर वर्ग की जरूरत है अपने आप में एक दिनचर्या है कि किसी तरह के बिना $ DB कनेक्शन हो जाता है के साथ कॉल करने के लिए इसे फिर से स्थापित करें। नोट मैं इसे स्थैतिक वर्ग में इंजेक्ट नहीं कर सकता क्योंकि यह तत्काल नहीं है।

बेशक समस्या हल हो जाती है अगर मैं एक स्थिर वर्ग से नियमित कक्षा में स्विच करता हूं और अपनी $ Foo ऑब्जेक्ट को तुरंत चालू करता हूं। मैं फिर सार्वजनिक चर पर एक सेटिंग के रूप में $ डीबी var इंजेक्ट कर सकता था। या $ डीबी var प्राप्त करने के लिए एक सार्वजनिक विधि जोड़ें और फिर $ Foo ऑब्जेक्ट का एक निजी var सेट करें। या, एक वर्ग निर्माता $ डीबी var स्वीकार करते हैं और $ Foo ऑब्जेक्ट का एक निजी var सेट करते हैं। लेकिन सभी 3 तकनीकों की आवश्यकता है कि मैं एक स्थिर वर्ग से नियमित कक्षा में स्विच करूं।

कुछ लोगों ने रजिस्ट्री पैटर्न या सिंगलटन पैटर्न नामक कुछ का उल्लेख किया है (मुझे लगता है कि यह वही बात है? सुनिश्चित नहीं है)। क्या मुझे इस समस्या को कुशलतापूर्वक हल करने की आवश्यकता है?

सबसे अधिक बात यह है कि मैं "वैश्विक $ डीबी" कहने से बचता हूं क्योंकि लोग इसके बारे में चिंतित हैं।

उत्तर

10

मैं इसके लिए सिंगलटन पैटर्न का उपयोग करता हूं और करता हूं। आप चीजों initializeConnection() कॉल के साथ एक बार सेट कर सकते हैं, और फिर बस तब से Database_Manager :: getDb() फोन बाहर पर

class Database_Manager 
{ 
    private static $instance; 
    private $db_connection; 

    public static function getInstance() 
    { 
     if (self::$instance == null) { 
      $className = __CLASS__; 
      self::$instance = new $className(); 
     } 
     return self::$instance; 
    } 

    public static function initializeConnection($connectionInfo) 
    { 
     $db = self::getInstance(); 
     //call init functions.. connect to db, etc 
      //save connection to $db->db_connection; 

    } 

    public static function getDb() 
    { 
     $db = self::getInstance(); 
     return $db->db_connection; 
    } 
} 

: मैं एक वर्ग है कि मैं सिर्फ यहाँ Database_Manager फोन करता हूँ उपयोग करते हैं।

इस दृष्टिकोण के बारे में अच्छी बात यह है कि इसे कई डेटाबेस से कनेक्शन प्रबंधित करने के लिए आसानी से संशोधित किया जाता है, और आपको प्रति डेटाबेस केवल एक खुला कनेक्शन होने की गारंटी है।

ध्यान दें कि मैंने सिंगलटन कार्यान्वयन की कुछ नट-किरकिरा छोड़ दी है, जैसे कि __construct() फ़ंक्शन प्राइवेट घोषित करना (ऊपर से अधिकतर स्मृति से कॉपी किया गया है)। मैं सिर्फ समग्र दृष्टिकोण दिखाना चाहता था।

+0

यह * बिल्कुल * मुझे जो चाहिए था, और मुझे नहीं पता था कि एक स्थिर वर्ग इसके अंदर एक वस्तु दृढ़ता बनाए रख सकता है। – Volomike

+0

सिंगलेट्स के साथ अच्छा समय। :) सहायता करके हमें खुशी होगी। – zombat

3

मुझे लगता है कि सिंगलटन जो भी करने की कोशिश कर रहा है उसके लिए अच्छा काम करेगा। अन्यथा आप 'ग्लोबल' कीवर्ड का उपयोग करने के लिए प्रतिबंधित हैं, जैसा कि आपने पहले ही पाया है, बेहद महंगा है।

+0

अच्छा। मैं सही रास्ते पर हूं। क्या आप मुझे एक उदाहरण दे सकते हैं? – Volomike

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