2010-09-29 16 views
5

मेरे पास एक डेटाबेस क्लास है, जिसका उपयोग MySQL क्वेरी चुनने, अपडेट करने, हटाने के लिए किया जाता है।किसी अन्य वर्ग से ऑब्जेक्ट तक कैसे पहुंचे?

अब, मैं किसी अन्य वर्ग के अंदर एक MySQL क्वेरी बनाना चाहते हैं, लेकिन अगर मैं index.php में $db = new DB(); परिभाषित करते हैं, मैं किसी अन्य वर्ग में $db वर उपयोग नहीं कर सकते। क्या मुझे एक क्वेरी बनाना चाहते हैं, तो क्या मुझे वैरिएबल $db बार-बार परिभाषित करना होगा? या किसी ऑब्जेक्ट ग्लोबल var के साथ $db var बनाने का कोई तरीका है?

उत्तर

0

अपने index.php फ़ाइल उपयोग

require_once('path_to_file_with_class.php'); 

तुम भी include_once है, जो आपको एक त्रुटि के बजाय एक चेतावनी दे देंगे अगर 'path_to_file_with_class.php' फाइल उपलब्ध नहीं है का उपयोग कर सकते हैं।

-1

आप अपने index.php फ़ाइल में वैश्विक रूप में यह परिभाषित कर सकता है, और कक्षा निर्माता में भी डाल $this->db &= $GLOBALS['db'];

5

आप शायद एक singleton चाहते हैं। यह आपको कोड में कहीं भी डीबी का उदाहरण प्राप्त करने का एक तरीका देता है। फिर कहीं भी आप एक प्रश्न करना चाहते हैं, पहले $db = DB::getInstance(); करें।

एक विकल्प dependency injection है, जो सभी कक्षाओं में एक डीबी उदाहरण पास करता है जिसे एक की आवश्यकता होती है।

+0

php में सिंगलटन पैटर्न के लिए एक उदाहरण यहां पाया जा सकता: http://www.weberdev.com/get_example-4002.html – Zilverdistel

+0

एक वस्तु विश्व स्तर पर उपलब्ध आप केवल एक स्थिर प्रणाली की जरुरत यह दृष्टांत के लिए बनाने के लिए । यह सिंगलटन होना जरूरी नहीं है। दोनों सुगंधित हैं, इसलिए निर्भरता इंजेक्शन जाने का रास्ता है। – Gordon

0

इसे कक्षा में परिभाषित करें (अलग PHP फ़ाइल)। इसके बाद प्रत्येक PHP फ़ाइल के लिए इसकी आवश्यकता होती है जिसमें var की आवश्यकता होती है।

0

सबसे पहले अपने डेटाबेस क्लास को singleton बनाएं। और फिर अपनी नई कक्षा में आप कुछ ऐसा कर सकते हैं:

class myNewClass{ 
    private $_db; 

    public function __construct(){ 
    $this->_db = DB::getInstance(); 
    } 
} 
0

जादू फ़ंक्शन __autoload() का उपयोग करें।

11

सबसे साफ दृष्टिकोण aggregate डेटाबेस वर्ग जहां injecting द्वारा आवश्यक होगा। global कीवर्ड का उपयोग करने या static विधियों का उपयोग करने जैसे अन्य सभी दृष्टिकोण, अकेले सिंगलटन को छोड़ दें, आपके वर्गों और वैश्विक दायरे के बीच कसकर युग्मन शुरू कर रहा है जो एप्लिकेशन को परीक्षण और बनाए रखने के लिए कठिन बनाता है। बस

// index.php 
$db = new DBClass;    // create your DB instance 
$foo = new SomeClassUsingDb($db); // inject to using class 

और

class SomeClassUsingDb 
{ 
    protected $db; 
    public function __construct($db) 
    { 
     $this->db = $db; 
    } 
} 

उपयोग Constructor Injection करते हैं निर्भरता उदाहरण के लिए एक मान्य राज्य बनाने के लिए आवश्यक है। यदि निर्भरता वैकल्पिक है या रनटाइम पर अदला-बदली करने की आवश्यकता है, तो सेटर इंजेक्शन का उपयोग करें, उदा।

class SomeClassUsingDb 
{ 
    protected $db; 
    public function setDb($db) 
    { 
     $this->db = $db; 
    } 
} 
+0

और मैं $ db var का उपयोग कैसे करूं? $ This-> db-> का चयन करें(); ? – Mike

+0

@ माइक हां, बिल्कुल इस तरह। या एक गेटर के माध्यम से (यदि आप एक लिखा है) – Gordon

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