2010-01-07 15 views
6

किसी को बहुत समय पहले यह पूछना चाहिए था।php में अन्य कक्षाओं में कक्षाओं का उचित उपयोग कर रहे हैं?

किसी अन्य वर्ग के भीतर अन्य कक्षाओं का उपयोग करने का सबसे अच्छा तरीका क्या है?

उदाहरण के लिए, मान लीजिए कि मैं एक आवेदन वर्ग है:

class Application 
{ 
    public function displayVar() { 
     echo 'hello world'; 
    } 
} 

और एक डेटाबेस वर्ग

class Database 
{ 
    // connects to db on construct 
    public function query() { 
     // queries db 
    } 
} 

अब, मैं अपने आवेदन वर्ग के लिए एक समारोह जोड़ना चाहते हैं से एक समारोह का उपयोग करता है डाटाबेस वर्ग

class Application 
{ 
    public function displayVar() { 
     echo 'hello world'; 
    } 
    public function getVar() { 
     global $db; 
     $sql = foo; 
     $db->query($sql); 
    } 
} 

तो फिर मैं

है
$db = new Database(); 
$app = new Application(); 
$app->getVar('var'); 

क्या ऐसा करने का कोई बेहतर तरीका है? वास्तव में जो मैं खोज रहा हूं वह इसे करने का मानक तरीका है, इसे छेड़छाड़ का दूसरा तरीका नहीं।

+1

हाँ, यह सवाल इस में गहरी जाने पर किया जाता है। आप इसे नागरिक से जांचना चाहेंगे। –

+0

ना, यहां का जवाब बिल्कुल वही है जो मैं ढूंढ रहा था। – Citizen

उत्तर

12

कि कुछ करने के तरीके के एक जोड़े हैं। वैश्विक चर निश्चित रूप से एक तरीका है और सबसे अधिक नीचे भी देखा जाता है। आप Singleton और डेटाबेस एक्सेस की आवश्यकता वाले सभी अन्य वर्गों को इस सिंगलटन पर कॉल कर सकते हैं।

final class Database { 
    private static $connection; 

    public static function getInstance() { 
     if(self::$connection == NULL) { 
      self::$connection = // init your database connection 
     } 
     return self::$connection; 
    } 
} 

और इस डेटाबेस कनेक्शन ऑब्जेक्ट का उपयोग किसी भी वर्ग में आवश्यक है।

class Application { 
    public function displayVar() { 
     echo 'hello world'; 
    } 
    public function getVar() { 
     $db = Database::getInstance(); 
     $sql = foo; 
     $db->query($sql); 
    } 
} 

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

class Application { 
    private $db; 

    public function __construct(Database $db) { 
     $this->db = $db; 
    } 

    public function displayVar() { 
     echo 'hello world'; 
    } 

    public function getVar() { 
     $sql = foo; 
     $this->db->query($sql); 
    } 
} 

छोटी परियोजनाओं के लिए, आप इसे आसानी से स्वयं कर सकते हैं। बड़ी परियोजनाओं के लिए, विभिन्न DI frameworks available for PHP

+0

बहुत बहुत धन्यवाद! – Citizen

+0

आप अपने दूसरे समाधान पर थोड़ा अधिक जोर देना चाहते हैं क्योंकि सिंगलटन दृष्टिकोण वास्तव में बड़ी संख्या में परेशानी का सामना कर रहा है। इसे आम तौर पर एक बुरी चीज के रूप में माना जाता है (लेकिन दुख की बात है कि अभी भी व्यापक रूप से उपयोग किया जाता है)। – ToBe

2

$db आपकी Application कक्षा की संपत्ति हो सकती है। Application का एक उदाहरण के भीतर से यह करने के लिए किसी भी संदर्भ $this माध्यम से किया जाना होगा - $this->db

class Application { 

    private $db = null; 

    public function setDB($name) { 
    $this->db = new Database($name); 
    } 

} 
+0

हाँ, मुझे वह मिला लेकिन फिर अन्य वर्गों के बारे में क्या? जैसे कि मेरे पास user.class.php या admin.class था।PHP, मुझे अभी भी कक्षा का उपयोग करने के लिए वैश्वीकरण करना होगा। – Citizen

+0

आपको अपनी परियोजना के बारे में अधिक जानकारी देना होगा। – Sampson

1

प्रत्येक PHP फ़ाइल में क्लास फ़ाइल (या स्वत: शामिल) सेट करें जिसमें प्रश्न में कक्षा की आवश्यकता है। फिर आवश्यकतानुसार इसे तुरंत चालू करें।

आप एक वस्तु का एक "आम" उदाहरण की आवश्यकता है, तो आप सिंगलटन और फैक्टरी पैटर्न देख सकते हैं:

Singleton Pattern Factory Pattern

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